Слишком много аргументов linux

Обновлено: 06.07.2024

Я только что обновил свой Ubuntu 16.04 до 17.04 и обнаружил небольшую проблему с командой cd .

Допустим, у меня есть две папки: album-01 & amp; album-02

В Ubuntu 16.04, если я сделаю cd album* , он перейдет к первой найденной папке album-01

Но в новой Ubuntu 17.04, если я сделаю cd album* , это приведет me -bash: cd: too many arguments

Как сделать cd в Ubuntu 17.04 подобно cd в Ubuntu 16.04?

4 ответа

Я не мог пока не протестируйте это на реальной системе 17.04 (проверено только, что она работает 16.04), но вы должны иметь возможность переопределить встроенную команду cd Bash своей собственной пользовательской функцией, которая отбрасывает любые дополнительные аргументы, кроме первый:

Обновление: Как предлагается в комментарии @ muru , эта версия ниже может работать лучше и поддерживать вызов cd без аргументов:

После того, как вы вы ввели эту строку выше в свой терминал, проверьте, работает ли cd теперь так, как вы хотите. В этом случае вы можете сделать это определение функции постоянным, добавив эту строку в конец вашего файла

/ .bashrc . В противном случае он исчезнет, ​​как только вы завершите текущий сеанс оболочки.

Обратите внимание, что если по какой-либо причине вам временно потребуется использовать реальную встроенную команду cd Bash вместо этой настраиваемой функции, вы можете просто вызовите его с помощью команды cd вместо обычного cd .

Краткий ответ / обходной путь

Чтобы ответить на ваш вопрос в этом конкретном случае, это работает

Но, вероятно, это не та функциональность, которую вы действительно хотите.

Что изменилось?

Похоже, что config-top.h в Bash-4.4 был обновлен, чтобы добавить следующий параметр

И builtins / cd.def ссылается к вашей ошибке здесь:

Что я могу сделать в долгосрочной перспективе?:

Вы можете скомпилировать свой собственный bash без новых CD_COMPLAINS , но это будет утомительно. Вы можете переопределить функциональность cd , как предлагается здесь, или использовать псевдоним функции, например

Proving it

Bash 4.4 Beta, где она все еще работает

Bash 4.4 Stable Release, где она не работает

Я никогда не сталкивался с этой проблемой, так как всегда использую Завершение вкладки.

Поэтому в вашем случае, вместо того, чтобы иметь неточное предположение относительно того, какой каталог мне нужен, я бы набрал cd al Вкладка , которая, если есть только одно совпадение, завершает его, а если есть 2 или более, завершает до того места, где совпадение заканчивается, а Вкладка Вкладка перечисляет варианты.

Вот пример из моей системы:

, за которым следует Tab Tab производит

Это похоже на ошибку в Bash: для man builtins старое поведение является правильным.

Вы можете сообщить об ошибке в ошибке- список рассылки bash ; подробнее здесь .

Собственно, об ошибке сообщалось (давно). Если вам нужен фиксированный Bash сейчас, сейчас, сейчас , вот как это сделать правильно (протестировано 17.10, должно работать и на других).

Сначала создайте каталог для работы, например :

Получите пакет с исходным кодом и зависимости сборки:

Отредактируйте config-top.h , чтобы изменить это (должна быть строка 32)

Изменить debian / changelog и добавьте такую ​​запись вверху (вы также можете использовать команду dch -i ):

Наиболее важные моменты - добавить + foo на текущий номер версии ( foo может быть любой строкой строчных букв; будьте осторожны, если вы используете dch -i , последнее число будет увеличиваться, поэтому вам нужно вернуть его к текущему) и использовать правильное название выпуска (здесь artful ). Наконец, запустите dpkg-source --commit .

Затем вы можете запустить команду debuild , и если все пойдет хорошо (ошибки о debsign могут быть игнорируется) у вас должно быть несколько .deb в родительском каталоге, которые вы можете установить как обычно (нет необходимости устанавливать их все, только те, которые у вас есть сейчас; используйте dpkg - l | grep bash , чтобы узнать).

Обратите внимание, что номер версии нового пакета установлен так, что вы автоматически получите любое будущее обновление для bash ; если обновление не устраняет проблему, повторите описанный выше процесс.

(Этот ответ был впервые опубликован на этот повторяющийся вопрос .)

Еще простой (наверное) вопрос, если пошлете учить матчасть - укажите направление :)

Це шо вообще такое?! Вообще синтаксис у баша странный конечно. Матчасти мне, матчасти!



Все, что в двойных скобкаъ считается одним словом, разбивки не происходит, это эквивалентно directory=$ourpath

А здесь двойных скобок нет, поэтому разбивка слов происходит и команда разбивается на if [ -x /bin /usr/bin … и что там ещё в $PATH


google://advanced bash scripting guide


Благодарю, после того, как убрал двойные кавычки в $ourpath, все заработало! А что за двойные скобки?




Тему можно считать решенной, если знаете, помогите с последним вопросом (он выше, в конце темы), и закроем ее :3


Так потому что разбор $ourpath на слова уже произошёл.


$0 — имя файла вызываемого скрипта

redgremlin ★★★★★ ( 24.07.17 20:45:26 )
Последнее исправление: redgremlin 24.07.17 20:45:55 (всего исправлений: 1)


почитаем про это, благодарю))


Когда СКРИП не работает, тут надо к физикам, умвр, если поелозить - скрипитъ.


fuck, thank you :3


вместо всего вашего велосипеда, ну да ладно.


Благодарю) Эт не велосипед, это, простите за плохие слова, код авторов книги.


Я только что обновил Ubuntu 16.04 до 17.04 и нашел небольшую проблему с командой cd .

Предположим, что у меня есть две папки: album-01 & amp; album-02

В Ubuntu 16.04, если я делаю cd album* , он перейдет в первую найденную папку album-01

Но в новом Ubuntu 17.04, если я сделаю cd album* , это приведет меня -bash: cd: too many arguments

Как сделать cd в Ubuntu 17.04 как cd в Ubuntu 16.04?

4 ответа

Я не мог проверить это на реальной системе 17.04 (только проверено, что оно работает с 16.04), но вы можете переопределить встроенную команду cd Bash с вашей собственной пользовательской функцией, которая отбрасывает любые дополнительные аргументы, кроме первого:

Обновление: Как указано в комментарий @ muru , эта версия ниже может работать лучше и поддерживать вызов cd без аргументов:

После того, как вы ввели эту строку выше в своем терминале, убедитесь, что теперь cd ведет себя так, как вы хотите. Если это так, вы можете сделать это определение функции постоянным, добавив эту строку в конец вашего файла

/.bashrc . В противном случае он исчезнет, как только вы закончите текущий сеанс оболочки.

Обратите внимание: если по какой-либо причине вам временно необходимо использовать настоящую команду cd Bash вместо этой настраиваемой функции, вы можете просто вызвать ее с помощью command cd вместо простого cd .

Краткий ответ / Временное решение

Чтобы ответить на ваш вопрос в этом конкретном случае, это работает

Но это, вероятно, не функциональность, которую вы действительно хотите.

Что изменилось?

Похоже, что config-top.h в Bash- 4.4 была обновлена, чтобы добавить следующий параметр

И builtins/cd.def относится к вашей ошибке здесь

Что я могу сделать в долгосрочной перспективе?

Вы можете скомпилировать свой собственный bash без нового CD_COMPLAINS , но это утомительно. Вы можете переопределить функциональность cd , как предлагается здесь, или вы могли бы использовать функцию типа

Доказательство

Bash 4.4 Beta, где он все еще работает

Bash 4.4 Стабильный релиз, где он не работает

Я никогда не сталкивался с этой проблемой, поскольку я всегда использую Завершение вкладки.

Итак, в вашем случае вместо того, чтобы иметь неточное предположение относительно того, какой каталог я хочу, я бы набрал cd al Tab , который, если есть только одно совпадение, завершает его, и если есть 2 или больше завершается до конца совпадения, а вкладка Tab перечисляет варианты.

Вот пример из моей системы:

, а затем вкладка вкладка создает

Это выглядит как ошибка в Bash: per man builtins старое поведение является правильным.

Вы можете сообщить об ошибке в списке рассылки bug-bash ; подробнее здесь .

Собственно, ошибка была сообщена (давно). Если вы хотите установить фиксированный Bash сейчас, теперь now , вот как это сделать правильно (тестирование на 17.10, также должно работать и на других).

Сначала создайте каталог для работы, например:

Получить исходный пакет и зависимости сборки:

Измените config-top.h , чтобы изменить это (должна быть строка 32)

Измените debian/changelog и добавьте запись вверху (вы также можете использовать команду dch -i ):

Затем вы можете запустить команду debuild , и если все будет хорошо (ошибки в debsign могут быть проигнорированы), у вас должно быть некоторое количество .deb s в родительском каталоге, которое вы можете установить как обычно (есть нет необходимости устанавливать их все, только те, которые у вас есть сейчас, используйте dpkg -l | grep bash , чтобы узнать).

Обратите внимание, что номер версии нового пакета установлен так, что вы автоматически получите какое-либо будущее обновление bash ; если обновление не устраняет проблему, вам необходимо повторить описанный выше процесс.

(Этот ответ был впервые отправлен на этот дублированный вопрос .)

Closed 10 months ago .

Whenever a file name has a space in it. It is showing this error. What should I do?

24 просмотра

1 ответ

6 Репутация автора

Я относительно новичок в командной строке. Я установил терминал Hyoer, и смена каталога в CD работала очень хорошо. сегодня всякий раз, когда я пытаюсь изменить каталог с помощью cd, он выдает мне bash: cd: слишком много аргументов. Я не могу двигаться ниже, чем каталог по умолчанию, который является пользователями.

Ответы (1)

1833 Репутация автора

cd требуется ровно 1 аргумент: имя каталога, на который вы меняете. Вы указали более одного аргумента.

Есть несколько причин, почему cd можно получить более 1 аргумента. Например, я ленивый типер, поэтому я часто использую * , как в:

Это работает, пока я не создаю каталог very_important_files .

Однако наиболее очевидным является то, что в имени каталога есть пробел. Например, если у вас есть каталог с именем directory with space , и вы это сделаете cd directory with space , bash интерпретирует это как команду cd с тремя аргументами:

Что не то, что вы хотите. Вы можете заставить bash рассматривать его как один аргумент, заключив его в кавычки: cd "directory wth space"

Как научиться программировать на Swift

Программирование и разработка

Со временем объем хранилища, используемый в управляемой системе Linux, также увеличивается. В результате мы пытаемся манипулировать файлами, перемещать, искать, удалять файлы и т.д. С помощью таких команд, как mv, is, cp, rm и т.д. Давайте рассмотрим проблему «слишком длинный список аргументов» и найдем способ ее решения. с легкостью.

Общий синтаксис этой ошибки примерно такой.

Что такое «слишком длинный список аргументов»?

Внутри командной строки, когда пользователь превышает максимально допустимую длину командной строки после ограничения для аргументов в вашей команде, возникает ошибка «Список аргументов слишком длинный».

Почему возникает эта ошибка?

Он достигает предела ARG_MAX, когда пользователь вводит слишком много аргументов в одной команде. Аргументы для функции exec могут быть до максимальной длины ARG_MAX. Если список аргументов слишком длинный, пользователь получил уведомление с помощью «Список аргументов слишком длинный». ошибка.

Аргумент также можно назвать аргументом командной строки. Для управления процессом командной строки команда определяется посредством ввода, предоставленного пользователем. Укажите аргументы в командной строке, а затем введите аргументы в консоли или терминале.

РЕШЕНИЕ: / bin / rm: слишком длинный список аргументов

Ошибка «Список аргументов слишком длинный» не возникает, для этого пользователь может узнать, какой длины должна быть команда. Операционная система определяет длину команды. Мы можем проверить максимальное количество аргументов в системах Linux с помощью следующей команды.

Помимо этого, существует множество решений для устранения указанной выше ошибки.

Восстановите папку после ее удаления

Предположим, есть каталог, в котором нет файлов, которые пользователи хотят сохранить. В этом случае самое быстрое и лучшее решение — удалить и воссоздать этот каталог. Но при этом пользователь должен сначала убедиться, что в удаляемом им каталоге нет такого файла, который он хочет сохранить.

Пользователь должен удалить все файлы и папки из каталога. В этом случае пользователь может сделать это с помощью команды rm, т. Е. Подстановочного знака «*.» В этом состоянии длина нашей команды становится очень большой. Чтобы решить эту проблему, мы можем применить только один аргумент для одновременного удаления всего каталога, используя следующую команду.

Если нам все еще нужно сохранить каталог, мы можем воссоздать его с помощью следующей команды.

Я не смог найти какой-либо простой простой ресурс, излагающий смысл и исправление для следующей ошибки оболочки BASH, поэтому я отправляю то, что нашел после исследования.

Ошибка:

версия для Google: bash open square bracket colon too many arguments .

Контекст: условие if в одиночных квадратных скобках с простым оператором сравнения, например, равным, большим и т.д., например:

Если ваш $VARIABLE представляет собой строку, содержащую пробелы или другие специальные символы, и одинарные квадратные скобки используются (это сокращение для команды test ), то строка может быть разбита на несколько слов, Каждый из них рассматривается как отдельный аргумент.

Чтобы одна переменная была разбита на множество аргументов:

То же самое будет верно для любого вызова функции, который записывает строку, содержащую пробелы или другие специальные символы.

Оберните вывод переменной в двойные кавычки, заставив его остаться как одна строка (следовательно, один аргумент). Например,

Просто так. Но перейдите к разделу "Также остерегайтесь. " ниже, если вы также не можете гарантировать, что ваша переменная не будет пустой строкой или строкой, которая содержит только пробелы.

Или альтернативное исправление заключается в использовании двойных квадратных скобок (что является сокращением для команды new test ).

Это существует только в bash (и, по-видимому, korn и zsh), и поэтому может быть несовместимо с оболочками по умолчанию, вызываемыми /bin/sh и т.д.

Это означает, что в некоторых системах он может работать с консоли, но не при вызове в другом месте, например, из cron , в зависимости от того, как все настроено.

Это будет выглядеть так:

Если ваша команда содержит двойные квадратные скобки, подобные этой, и вы получаете ошибки в журналах, но она работает из консоли, попробуйте поменять [[ на альтернативу, предложенную здесь, или убедитесь, что при выполнении вашего скрипта используется оболочка поддерживает [[ aka new test .

Также остерегайтесь ошибки [: unary operator expected

Если вы видите ошибку "слишком много аргументов", скорее всего, вы получаете строку из функции с непредсказуемым выводом. Если также возможно получить пустую строку (или всю строку пробелов), это будет рассматриваться как нулевые аргументы даже с указанным выше "быстрым исправлением" и завершится ошибкой с [: unary operator expected

Это то же самое "надо", если вы привыкли к другим языкам - вы не ожидаете, что содержимое переменной будет эффективно напечатано в коде, подобном этому, до его оценки.

Вот пример, который предотвращает как ошибки [: too many arguments , так и [: unary operator expected : замена вывода значением по умолчанию, если оно пустое (в данном примере, 0 ), с двойными кавычками, обернутыми вокруг всего:

(здесь действие произойдет, если $ VARIABLE равно 0 или пусто. Естественно, вы должны изменить 0 (значение по умолчанию) на другое значение по умолчанию, если требуется другое поведение)

Последнее замечание: Поскольку [ является ярлыком для test , все вышесказанное также верно для ошибки test: too many arguments (а также test: unary operator expected )

Читайте также: