$ man bash
$ bind 'set revert-all-at-newline on'
$ man bsh # up arrow and edit
No manual entry for bsh
$ man bash # three up arrows
Смотрите эту [112758]ArchLinux Wiki о разметке[112759] для более подробной информации.[112424]
Как я уже говорил в моем комментарии, я предполагаю, что ваш вопрос на самом деле
Как использовать
Найти
Команда для проверки одного файла, чтобы увидеть Удовлетворяет ли этотест
, например, размер= некоторое указанное число?
, где имя файла указывается как параметр к сценарию (и, таким образом, не известно вам заранее). Вы создаете ответ вокруг команды
if find . -name "$1" -size "$2"c | grep -q .
then
echo OK
fi
Я взял свободу вставки цитат, которые рекомендуется DHAG. Это не плохое начало, но у него есть некоторые проблемы:
test.txt
, а также
Существует файл под названием test.txt
в подкаталоге текущего каталога ,
Тогда Найти
найдет его и распечатайте его путь,
и поэтому преуспеют
.
Но если ваш сценарий пытается сделать что-то с помощью файла под названием test.txt
В текущем каталоге он не удастся, потому что такого файла нет. -MaxDepth 1
Для предотвращения найти
от поиска в подкаталогах. my_subdir / test.txt
,
Тогда найти
, потерпит неудачу , потому что аргумент -NAME
может не содержать скольжения. «*»
просто чтобы вызвать проблемы. Использование Найти.
кажется немного глупым
Когда вы на самом деле не хотите искать дерево каталогов.
Вы знаете имя файла; Вы просто хотите проверить свои свойства.
Ну, если вы прочитаете между строками , найдите (1)
с одним закрытым глазом,
Вы понимаете, что на самом деле не говорит, что путь
должны быть каталоги - это просто подразумевает это.
Оказывается, что вы можете сказать
find filename [expression]
, применяемый к вашему вопросу, это становится
find "$1" -size "$2"c
как здравоохранение, я рекомендую:
if [ -f "$1" ] && find "$1" -size "$2"c | grep -q .
then
echo OK
fi
Чтобы не получить сообщение об ошибке из Найти
Если указанный файл не существует вообще
(и предотвратить вышеупомянутый озорной пользователь
отдавая скрипт имя каталога).
Здесь существует три несвязанных использования @
.
В $ @
символ @
является именем автоматической переменной , которая может использоваться в правиле. Значение этой переменной является целью, которую строит правило.
Если @
используется в самом начале строки рецепта (команды) сразу после символа табуляции, команда не будет напечатана , когда она будет выполнена.
Символ @
в другом месте не является особым.
Таким образом, в вашем примере для построения программы
:
file
. Он записывает зависимости целевой переменной ( $ ^
автоматическая переменная) в файл program.in
. Выполняется любая команда, сохраненная в переменной CMD
, с параметрами, сохраненными в переменной CMDFLAGS
, плюс дополнительный параметр @ program.in
. Это зависит от того, что такое CMD
.
Команда rm program.in
выполняется без предварительной печати.
Несколько команд рассматривают параметр, начинающийся с @
, как указывающий файл, из которого требуется прочитать дополнительные параметры. Это соглашение DOS, которое возникло, потому что DOS имел строгий предел длины командной строки и не путь интерполировать вывод команды в командную строку. Это редкость в мире Unix, так как Unix не имеет этих ограничений. Эффект рецепта, таким образом, вероятно, тот же, что и
$(CMD) $(CMDFLAGS) $(OBJECTS)
-121--41555- ps
получает всю его информацию из смонтированных procfs, поэтому без procfs нет источника для получения этой информации. Единственный вариант, который я вижу, это монтировать proc для вызова ps/top, а затем демонтировать его, что минимизирует риск.
Возможно, простой перенос выходных данных find
в grep
сделает следующий трюк:
if find . -name test.txt -size 156c | grep -q .; then echo Found; fi
Вызов find
не будет иметь выходных данных, если не будет найден файл, соответствующий заданным вами условиям имени и размера, и grep.
будет иметь статус выхода 0 («true»), только если его вход не пуст. Опция -q
просит не печатать никаких выходных данных, что не имеет значения здесь, потому что нас волнует только статус выхода.
Чтобы устранить еще один возможный источник путаницы: поскольку @ derobert упоминается в комментарии, скобки не являются частью синтаксиса конструкции , если
вообще: вы обнаружите, что существует команда с именем [
, которая выполняет задачу вычисления логического выражения и возврата их истинного значения в виде кода выхода ( [
также может быть встроенной оболочкой); эта команда проверяет наличие закрывающей скобки:
$ [ 3 -gt 2 ] ; echo $?
0
$ [ 3 -lt 2 ] ; echo $?
1
$ [ 3 -lt 2 ; echo $?
bash: [: missing `]'
2
В приведенных выше командах 0 означает true, 1 означает false, а 2 сигнализирует об ошибке.
Подобно решениям grep
, предлагаемым в другом месте, но, возможно, проще, вы можете просто прочитать
единственная строка из , находка
. Это гарантирует, что find
завершит работу (потому что read
определенно будет) при первом совпадении и даст вам надежное возвращаемое значение.
find . -name test.txt -size 156c |
read -r na && echo ok || ! echo shite
... должно работать нормально. Если find
что-то напечатает, у него будет завершающийся символ новой строки, поэтому read
вернет true даже для одного совпадения из find
, но если find
ничего не печатает, тогда read
достигнет EOF
перед чтением электронной строки \ n
, и поэтому он вернет ошибку.