Ваш магический союз - точка с запятой ... и фигурные скобки:
{ cat wordlist.txt ; ls ~/folder/* ; } | wc -l
В фигурных скобках команды сгруппированы только вместе, поэтому знак канала |влияет на объединенный вывод.
Вы также можете использовать круглые скобки ()вокруг группы команд, которые будут выполнять команды в подоболочке. Это имеет тонкий набор различий с фигурными скобками, например, попробуйте следующее:
cd $HOME/Desktop ; (cd $HOME ; pwd) ; pwd
cd $HOME/Desktop ; { cd $HOME ; pwd ; } ; pwd
Вы увидите, что все переменные окружения, включая текущий рабочий каталог, сбрасываются после выхода из группы в скобках, но не после выхода из группы фигурных скобок.
Что касается точки с запятой, альтернативы включают &&и ||знаки, которые условно выполнить вторую команду , только если первая успешна или нет, соответственно, например ,
cd $HOME/project && make
ls $HOME/project || echo "Directory not found."
Это работает! Помогите мне узнать - что именно здесь делают фигурные скобки? Какие еще магические силы они имеют?
Дэвид Онеил
@DavidOneill { list; }- составная команда . От bash(1): список просто выполняется в текущей среде оболочки. список должен заканчиваться символом новой строки или точкой с запятой. [..] Статус возврата - это статус выхода из списка.
Лекенштейн
Я добавил немного больше информации к ответу. Полное руководство по написанию сценариев оболочки с помощью bash - это man-страница bash, введите ее man bashиз командной строки и просмотрите ее.
Паблом
должен; в этих командах не должно быть && в случае, если файл wordlist.txt не существует?
Rinzwind
Если wordlist.txtне существует, ошибка от catпоявится при стандартной ошибке, но не при стандартном выводе, поэтому wc -lне будет отсчитывать ни одной строки из нее. То же самое касается ~/folderне существующего. Можно было бы добавить 2> /dev/nullмежду каждой из этих команд и их точкой с запятой, чтобы предотвратить шум при стандартной ошибке, но, помимо того, что это некрасиво, сообщения об ошибках безвредны для подсчета строк.
Паблом
8
Поскольку wcв качестве входных данных принимается путь к файлу, вы также можете использовать подстановку процесса:
Имейте в виду, что ls ~/folder/*также возвращает содержимое подкаталогов, если таковые имеются (из-за расширения glob). Если вы просто хотите перечислить содержимое ~/folder, просто используйте ls ~/folder.
Это wc -lбыл просто выдуманный пример, я на самом деле собираюсь сделать что-то более сложное, у которого нет этой опции.
Дэвид Онеил
2
@DavidOneill Ну, так как catпринимает аргумент файла, вы можете использовать cat <(cat wordlist.txt; ls wordlist.txt) | wc -lи даже cat wordlist.txt <(ls wordlist.txt) | wc -l. Это, конечно, очень уродливо, но демонстрирует бесконечные возможности с инструментами командной строки.
Лекенштейн
1
@DavidOneill Правильно, я исправил это сейчас, спасибо.
Лекенштейн
1
Вы хотите, ls ~/folder/чтобы, если ~/folderэто символическая ссылка, lsперечисляла содержимое своей цели вместо самой ссылки. Между прочим, все lsкоманды должны сопровождаться -1так, чтобы один файл на строку печатался и wc -lбыл правильным способом подсчета файлов.
Паблом
@pablomme Вы правы насчет символической ссылки, но -1подразумевается, что вывод - это не терминал, а канал.
Лекенштейн
2
Я задавал себе тот же вопрос и в итоге написал короткий сценарий.
magicalUnionThing(Я это называю append):
#!/bin/sh
cat /dev/stdin
$*
Сделайте этот скрипт исполняемым
chmod +x ./magicalUnionThing
Теперь ты
cat wordlist.txt |./magicalUnionThing ls ~/folder/* | wc -l
Что оно делает:
Отправить стандартный ввод на стандартный вывод
Выполнить аргумент. $*возвращает все аргументы в виде строки. Вывод этой команды идет в стандартный вывод скрипта по умолчанию.
Таким образом, стандартный вывод magicalUnionThing будет его стандартным выводом + стандартный вывод команды, передаваемой в качестве аргумента.
Есть, конечно, более простые способы, как в других ответах.
Может быть, эта альтернатива может быть полезна в некоторых случаях.
{ list; }
- составная команда . Отbash(1)
: список просто выполняется в текущей среде оболочки. список должен заканчиваться символом новой строки или точкой с запятой. [..] Статус возврата - это статус выхода из списка.man bash
из командной строки и просмотрите ее.wordlist.txt
не существует, ошибка отcat
появится при стандартной ошибке, но не при стандартном выводе, поэтомуwc -l
не будет отсчитывать ни одной строки из нее. То же самое касается~/folder
не существующего. Можно было бы добавить2> /dev/null
между каждой из этих команд и их точкой с запятой, чтобы предотвратить шум при стандартной ошибке, но, помимо того, что это некрасиво, сообщения об ошибках безвредны для подсчета строк.Поскольку
wc
в качестве входных данных принимается путь к файлу, вы также можете использовать подстановку процесса:Это примерно эквивалентно:
Имейте в виду, что
ls ~/folder/*
также возвращает содержимое подкаталогов, если таковые имеются (из-за расширения glob). Если вы просто хотите перечислить содержимое~/folder
, просто используйтеls ~/folder
.источник
wc -l
был просто выдуманный пример, я на самом деле собираюсь сделать что-то более сложное, у которого нет этой опции.cat
принимает аргумент файла, вы можете использоватьcat <(cat wordlist.txt; ls wordlist.txt) | wc -l
и дажеcat wordlist.txt <(ls wordlist.txt) | wc -l
. Это, конечно, очень уродливо, но демонстрирует бесконечные возможности с инструментами командной строки.ls ~/folder/
чтобы, если~/folder
это символическая ссылка,ls
перечисляла содержимое своей цели вместо самой ссылки. Между прочим, всеls
команды должны сопровождаться-1
так, чтобы один файл на строку печатался иwc -l
был правильным способом подсчета файлов.-1
подразумевается, что вывод - это не терминал, а канал.Я задавал себе тот же вопрос и в итоге написал короткий сценарий.
magicalUnionThing
(Я это называюappend
):Сделайте этот скрипт исполняемым
Теперь ты
Что оно делает:
$*
возвращает все аргументы в виде строки. Вывод этой команды идет в стандартный вывод скрипта по умолчанию.Таким образом, стандартный вывод magicalUnionThing будет его стандартным выводом + стандартный вывод команды, передаваемой в качестве аргумента.
Есть, конечно, более простые способы, как в других ответах.
Может быть, эта альтернатива может быть полезна в некоторых случаях.
источник