2014-04-30 3 views
2

Меня это сбивает с толку, когда я вижу в сценарии какую-то скобку и запятую. Я не могу понять, как это получается. НапримерЧто делает скобка и запятая в поиске?

find /work \(-fprint /dev/stderr \) , \(-name 'core' -exec rm {} \; \)

Вопрос: - -что делает кронштейн делать? -Что делает запятая? -Где я могу получить это руководство о ключе и ключевом слове запятой в bash.

+0

'man bash' ????? – John3136

+0

Посмотрите 'man find' на свой компьютер. Или просмотрите [справочные страницы в Интернете] (http://www.linuxmanpages.com/man1/find.1.php). –

+0

Спасибо. Я рассмотрю его. – taymedee

ответ

2

Скобки/скобки используются find для обеспечения приоритета среди своих предикатов. Запятая - это оператор в GNU find, который оценивает как предыдущий предикат, так и предикат, который следует, но игнорирует результат первого. В вашей команде

find /work \(-fprint /dev/stderr \) , \(-name 'core' -exec rm {} \; \) 

у вас есть два (соединение) предикаты:

  • -fprintf /dev/stderr
  • -name 'core' -exec rm {} \;

Первая печатает имя найденного файла в стандартную ошибку. Второй удаляет только те файлы, имя которых core. Без запятой только имена удаляемого файла будут записаны на стандартный вывод; то есть запятая переопределяет неявный and, выполняемый по нескольким предикатам. (Скобки вокруг -fprintf могут быть необязательными, поскольку они просто образуют группу, состоящую из одного предиката, но я не уверен.)

+0

Как вы сказали, первый печатает имя найденного файла стандартной ошибке, затем какое ключевое слово для отображения списка на экран? – taymedee

+0

Если вы абсолютно, положительно, должны писать на экран, используйте '/ dev/tty'. Однако обычно лучше писать в '/ dev/stderr' (для ошибок) или'/dev/stdout' (для фактического вывода), и позволить пользователю команды решить, должны ли эти дескрипторы файлов указывать на терминал или другой файл или конвейер. При запуске стандартный вывод и ошибка вашей оболочки привязаны к терминалу/экрану, и любые программы, запущенные оболочкой, наследуют те же дескрипторы файлов, если они явно не изменены. – chepner

+0

Это имеет смысл, спасибо за ваше замечательное объяснение :) – taymedee

2

( и ) используются в bash для выполнения одной или нескольких команд в подклассе. Вы можете найти более подробную информацию по этой теме: http://www.tldp.org/LDP/abs/html/subshells.html.

Однако в команде, которую вы опубликовали, они не используются bash, так как они экранированы - вы используете \( вместо (. В результате в качестве аргументов ( и ) переданы в find. Также обратите внимание, что ; также экранирован, поскольку имеет специальное значение в bash. Что касается find, то она видит следующие аргументы:

/work (-fprint /dev/stderr) , (-name 'core' -exec rm {} ;) 

Запятая (,) является частью команды find. bash ничего не делает с этим.

+0

Позвольте мне угадать, это означает найти что-нибудь в каталоге «work» и отпечатать его до/dev/stderr, между тем он удалит файл, содержащий «ядро» в содержимом файла? – taymedee

+0

Первая часть права. Вторая часть означает удаление всех названных файлов (это то, что означает флаг '-name')' core' под '/ work' или любой из его подкаталогов. –

+0

@R Sahu Я вижу, спасибо :) – taymedee

Смежные вопросы