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

Обновлено: 21.11.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Используя команду find для удаления массовых файлов

Этот процесс относительно прост, быстр и точен. Пользователи могут искать любой файл, используя команду find и удаляя его.

С помощью команды, написанной выше, мы можем найти любой файл из каталога.

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

С помощью цикла

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

Приведенная выше команда удалит все файлы, присутствующие в каталоге.

Ручное разделение

Пользователи могут многократно выполнять команду, разбивая файл на более мелкие группы, каждая из которых использует разные строки в качестве аргументов с помощью ls, wc, mv, cp, rm и т. д.

ls -lrt events1 * .log | туалет -l

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

Заключение

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

Об авторе

Пратик Джангид

Являюсь страстным пользователем Linux по личным и профессиональным причинам, всегда изучаю новинки мира Linux и делюсь ими со своими читателями.

200, 5

строка 5: [: слишком много аргументов

строка 5: [: слишком много аргументов

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

11 728, 1 345

-eq используется для чисел, а не строк.

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

12 315, 4 560

Немного расширяю то, что Джим уже сказал.

Вашу первую проблему (слишком много аргументов, вызванных неправильным цитированием ваших операндов) можно решить, изменив:

Ваша вторая проблема (использование оператора числового сравнения для сравнения нечисловых строк) может быть решена путем изменения:

Ваша третья проблема (предполагая, что размеры файлов, понятных человеку, изменятся достаточно быстро за пять секунд, когда размеры файлов будут достаточно большими, чтобы вызвать изменение в выводе) можно решить, изменив:

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

Ваша четвертая проблема (при условии, что размер файла изменится сразу между двумя соседними вызовами вышеуказанной команды du в начале вашего скрипта, может быть исправлена ​​путем перемещения sleep 5 из конца вашего цикла в начало вашего цикла .

Это приводит нас к измененному сценарию, который выглядит примерно так:

Но я совершенно не понимаю, почему вы хотите запускать команду xdotool getactivewindow key Ctrl каждые пять секунд, пока изменяется размер, казалось бы, не связанного файла, и не запускать ее вообще, если файл перестал расти до того, как ваш скрипт началось.

Надеюсь, это поможет. Но, поскольку я не понимаю, что вы пытаетесь сделать, возможно, я неправильно понял все, что вы пытаетесь сделать.

5 091, 1 931 

du указывает размеры файлов в "блоках", но это, безусловно, точнее, чем в мегабайтах.

Здесь наличие нескольких команд между while и do является альтернативой true / break .
Учитывается последний статус выхода (перед do ).

200, 5

Немного расширяю то, что Джим уже сказал.

Вашу первую проблему (слишком много аргументов, вызванных неправильным цитированием ваших операндов) можно решить, изменив:

Ваша вторая проблема (использование оператора числового сравнения для сравнения нечисловых строк) может быть решена путем изменения:

Ваша третья проблема (предполагая, что размеры файлов, понятных человеку, изменятся достаточно быстро за пять секунд, когда размеры файлов будут достаточно большими, чтобы вызвать изменение в выводе) можно решить, изменив:

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

Ваша четвертая проблема (при условии, что размер файла изменится сразу между двумя соседними вызовами вышеуказанной команды du в начале вашего скрипта, может быть исправлена ​​путем перемещения sleep 5 из конца вашего цикла в начало вашего цикла .

Это приводит нас к измененному сценарию, который выглядит примерно так:

Но я совершенно не понимаю, почему вы хотите запускать команду xdotool getactivewindow key Ctrl каждые пять секунд, пока изменяется размер, казалось бы, не связанного файла, и не запускать ее вообще, если файл перестал расти до того, как ваш скрипт началось.

Надеюсь, это поможет. Но, поскольку я не понимаю, что вы пытаетесь сделать, возможно, я неправильно понял все, что вы пытаетесь сделать.

Я просто хочу знать, происходит ли загрузка в Firefox.

Если происходит загрузка, не переходите в состояние приостановки.

474, 160 

  • Поскольку это находится на подфоруме Ubuntu, ps имеет опцию -b (размер в байтах);
  • Если вам нужен размер файла в байтах, безусловно, самый доступный (и, следовательно, наиболее переносимый) вариант — использовать wc -c
  • Поскольку вы используете bash, наверняка [[ . ]] лучше, так как вам не нужно заключать переменные в кавычки;
  • При использовании числового сравнения в bash использование конструкции (( . )) более удобочитаемо.

12 315, 4 560

Я просто хочу знать, происходит ли загрузка в Firefox.

Если происходит загрузка, не переходите в состояние приостановки.

Абсолютно ничего из того, что вы делаете в скрипте, который вы показали нам в этой ветке, не скажет вам ничего о том, загружает ли Firefox файл или нет, если только он не загружает один файл с именем /home/andy/Downloads/myfile .iso, если что-то не происходит за кулисами, например, команда xdotool getactivewindow key Ctrl имеет побочный эффект, вызывая изменение размера /home/andy/Downloads/myfile.iso, если Firefox загружает файл.

Вызывает ли запуск команды xdotool getactivewindow key Ctrl размер файла /home/andy/Downloads/myfile.iso?

Обратите внимание, что MadeInGermany правильно сообщает du -s о размерах файлов в виде количества блоков (блоков по 512 байт, если версия du в вашей версии Ubuntu соответствует стандартам; но весьма вероятно, что в большинстве версий систем Linux вы получите подсчет блока большего размера).Если вы хотите обнаруживать небольшие изменения, пожалуйста, не используйте wc -c путь, как это предлагает apmcd47; это значительно увеличит нагрузку на ЦП и ввод-вывод в вашей системе, если вы загружаете большой файл. Использование ls -n pathname было бы гораздо лучшим выбором. Он будет сообщать об изменениях размера файла в количестве байтов в файле и должен только выполнить stat() для файла, чтобы получить его размер; использование wc -c pathname обычно реализуется wc открытием, чтением и подсчетом каждого байта в pathname . (Обратите внимание, что вывод ls -n похож на вывод ls -l, за исключением того, что он печатает идентификатор пользователя владельца файла и идентификатор группы файловой группы вместо того, чтобы искать и печатать имя пользователя владельца файла и имя группы файловой группы; поэтому это немного быстрее и использует меньше системных ресурсов для выполнения работы. Если вы используете систему UNIX вместо системы Linux, я бы предложил использовать ls -og, который позволяет избежать полного вывода имен или идентификаторов пользователей и групп.)

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

$ echo это тест

$ echo "это тест"

$ [ 4 -eq 4 ] && echo ok

[ 4 -eq "$a" ] && echo ok

-bash: [: : ожидается целочисленное выражение

$ [ 4 = "$a" ] && echo ok || эхо пусто

Чтобы отличить строку от числа, используйте другой оператор.

$ [ 4 -eq 04 ] && echo ok || эхо нет

$ [ 4 = 04 ] && эхо ок || эхо нет

Однако ошибка, описанная в исходном сообщении, из-за сравнения нескольких элементов:

$ [ a = a b ] && echo ok

-bash: [: слишком много аргументов

Пробел является разделителем по умолчанию:

$ для элемента в b; выполнить эхо $item; готово

$ для элемента в "a b"; выполнить эхо $item; готово

Ответы

Проверьте следующее:

$, если [тест = $a]; затем эхо $a; фи

$, если [тест = $a]; затем эхо $a; фи

-bash: [: test: ожидается унарный оператор

$, если [тест = $a]; затем эхо $a; фи

-bash: [: слишком много аргументов

Включить в кавычки:

$, если [тест = "$a"]; затем эхо $a; фи

$, если [тест = "$a"]; затем эхо $a; фи

Вы получаете сообщение "слишком много аргументов", если у вас более одного процесса, содержащего строку "pmon".

Чего именно вы пытаетесь достичь?

Следующее может сработать:

Я хочу получить ORACLE_SID.

if [ $(ps -e -o command | grep pmon | grep -v grep | cut -d '_' -f3) = $pmon ]; затем

Можете ли вы описать, как вы хотите это сделать? Например, запросить процесс pmon и сохранить SID в переменной? Как вы планируете этого добиться? Что, если есть несколько процессов pmon для разных баз данных, то как подпрограмма узнает, какой из них вам нужен?

Искренне благодарю вас.

Позвольте мне вернуться в понедельник с более подробной информацией.

Вы можете использовать массивы bash, если ожидаете несколько процессов pmon. Например:

"Можете ли вы описать, как вы хотите это сделать? Например, запросить процесс pmon и сохранить SID в переменной? Как вы планируете это сделать? Что, если есть несколько процессов pmon в разных базах данных, то как будет ли подпрограмма знать, какой из них вам нужен?"

Вся часть:

для pmon в $(cat /etc/oratab | grep oracle | cut -d ':' -f1); сделать

if [ $(ps -e -o command | grep pmon | grep -v grep | cut -d '_' -f3) = $pmon ]; затем

Затем мы находимся в цикле для всех активных баз данных на сервере, и для каждой мы устанавливаем ORACLE_SID, а затем запускаем на ней некоторый SQL.

Итак, ваша первая проблема заключается в том, что вы сравниваете две строки в случае [ test ], поэтому вам нужно использовать кавычки ("):

if [ "$(ps -e -o command | grep pmon | grep -v grep | cut -d '_' -f3)" = "$" ]

Вторая проблема заключается в том, что ваш код не работает, когда в системе более одного pmon.

Если вы хотите иметь все ORACLE_SID в одной системе, которая работает в данный момент, попробуйте следующее:

[email protected]:/home/oracle/ [ASM] cat testScript.sh

для oracleSid в $(ps -ef|grep -iv grep|grep -iv awk | grep -i pmon|awk -F '_pmon_' '')

[email protected]:/home/oracle/ [ASM] bash cat testScript.sh

Надеюсь, это поможет

Извините, но помимо отсутствия кода здесь также отсутствует концепция. Использование oratab для этой цели не учитывает, что файл содержит комментарии, ошибки или что базы данных могут просто не работать или даже устареть. Как насчет мультиарендности 12c? Нет экземпляра для PDB. Если вы хотите подключиться ко всем запущенным базам данных, выполняющим синтаксический анализ oratab или pmon, потребуется сделать гораздо больше.

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

Опять же, чего вы пытаетесь добиться? Пожалуйста, не пытайтесь объяснить, показывая код?

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

Ошибка


Это ограничение распространяется на все обычные системные команды, такие как rm , ls , mv , cp и т. д.

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

"Слишком длинный список аргументов" означает, что пользователь вводит слишком много аргументов в одну команду, что превышает предел ARG_MAX. ARG_MAX определяет максимальную длину аргументов функции exec.

Аргумент, также называемый аргументом командной строки, может быть определен как ввод данных для команды, чтобы помочь управлять этим процессом командной строки. Аргументы вводятся в терминал или консоль после набора команды. Несколько аргументов могут использоваться вместе; они будут обработаны в том порядке, в котором они были введены, слева направо.

Это ограничение на длину команды накладывается операционной системой. Вы можете проверить ограничение на максимальное количество аргументов в вашей системе Linux с помощью этой команды:

Что вернет что-то вроде этого:

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

Решение

Существует ряд решений этой проблемы (bash: /usr/bin/rm: слишком длинный список аргументов).

Удалите саму папку, а затем создайте ее заново.

Если вы пытаетесь удалить ВСЕ файлы и папки в каталоге, вместо использования подстановочного знака «*» для удаления (например, rm *) вы можете попробовать следующее:

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

Массовое удаление файлов с помощью команды find:

Вы можете использовать команду find, чтобы найти каждый файл, а затем удалить его:

Или, чтобы удалить только определенные типы файлов (например, файлы .txt), используйте что-то вроде:

Теги: Linux, сервер, системные администраторы

Загрузите мою бесплатную 101 полезную команду Linux (PDF).

Кроме того, я буду уведомлять вас о публикации новых статей по Linux. - Подпишитесь сейчас и получите мой бесплатный PDF-файл.
(В среднем 1-2 письма в месяц.)

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