В терминале unix, если да:
egrep "Stuff" $(ls *.txt)
Результат очевиден. Но что делает
$(ls *.txt) самостоятельно? Я вижу, что могу воспроизвести эффект
egrep "Stuff" *.txt
Итак, что $(ls *.txt)?
"что делает $(ls *.txt) do"
$(ls *.txt) собирает список имен файлов, а затем управляет ими. Не используйте это.
Давайте создадим 4 файла, содержащие Stuff в нашем каталоге:
$ echo Stuff | tee file1 file2 'a b c.txt' 'f* .txt'
Stuff
$ ls -Q
"a b c.txt" "file1" "file2" "f* .txt"
Теперь давайте запустим команду egrep:
$ egrep "Stuff" $(ls *.txt)
grep: a: No such file or directory
grep: b: No such file or directory
grep: c.txt: No such file or directory
file1:Stuff
file2:Stuff
f* .txt:Stuff
grep: .txt: No such file or directory
Обратите внимание, что мы получаем 4 сообщения об ошибках о несуществующих файлах. Это связано с «что делает $(ls *.txt)» . Результат также показывает совпадения с двумя файлами file1 и file2, которые не должны были быть обысканы, потому что они не заканчиваются на .txt. Это из-за расширения _pathname.
Правильно написанная команда производит два успешных совпадения и отсутствие ошибок:
$ egrep -- "Stuff" *.txt
a b c.txt:Stuff
f* .txt:Stuff
Использование:
egrep -- "Stuff" *.txt
или POSIXly:
grep -E -- "Stuff" *.txt
или:
grep -E -e Stuff -- *.txt
Это будет работать с любым именем файла и не имеет ограничений в ls.
Этот вопрос, похоже, мало полезен в реальном мире, но
. Лучший способ получить полезный результат:
echo $(ls *.txt)
Или просто
ls *.txt
Здесь будут перечислены все файлы с расширением .txt. Чтобы найти текстовые файлы, содержащие определенную строку,
egrep -l "Stuff" *.txt
Для получения дополнительной информации о инструментах поиска сделайте
man egrep
$( ... )
Является заменой команды, она назначает вывод одной или нескольких команд в качестве ввода другой команды. Старый синтаксис: ` ... `.
Различие заключается в том, что ваши команды будут запускаться в разных оболочках:
echo $BASHPID $( echo $BASHPID )
5718 7138
На самом деле он вызывает подоболочку:
echo $BASH_SUBSHELL $( echo $BASH_SUBSHELL )
0 1
Команда $( ) запускает команду ls *.txt и возвращает STDOUT команды.
То, что это конкретное использование, является ошибкой программирования новичков по крайней мере на трех уровнях:
egrep 'Stuff' *.txt работает, как вы сказали, за исключением файлов, названных как-то вроде A File.txt. Выход ls для ввода программы неразумный. См. Причины $( ls *.txt) имена файлов mishandles с пробелами и другими забавными символами. find . -maxdepth 1 -type f -iname '*.txt' -print0 | xargs -0 egrep 'Stuff' является более пуленепробиваемым способом.Надуманный пример расширения / путаницы оболочки оболочки в ответ на @ 8bittree:
$ /bin/ls -l -b
total 36
-rw------- 1 w3 walt 2 Aug 11 13:41 A\ \\012\ File.txt
-rw------- 1 w3 walt 2 Aug 11 13:42 A\ \n\ File.txt
-rw------- 1 w3 walt 2 Aug 11 13:40 A\ File.txt
$ grep "STUFF" $(ls *.txt)
grep: A: No such file or directory
grep: \012: No such file or directory
grep: File.txt: No such file or directory
grep: A: No such file or directory
grep: File.txt: No such file or directory
grep: A: No such file or directory
grep: File.txt: No such file or directory
$ find . -maxdepth 1 -type f -iname '*.txt' -print0 | xargs -0 egrep 'Stuff'
$ find . -maxdepth 1 -type f -iname '*.txt' -print0 | xargs -0 egrep '1'
./A File.txt:1
Ничего себе, на мгновение я подумал, что вы задаетесь вопросом о `$(ls *.txt)` (с $(..) плюс backquotes)
По мере ответа на этот вопрос я просто предупрежу вас об одном. Вот последовательность команд, чтобы показать вам, почему это может быть опасно:
set -x Чтобы увидеть, что выполнено touch 'rm -f *.txt' Создайте текстовый файл с именем «rm -f * .txt», я использую простой цитаты здесь, поэтому Bash не будет расширять подстановочные знаки и пробелы. `$(ls *.txt)` Вот сложная часть. Команда ls *.txt будет запущена, а затем перенаправит результат на STDOUT. Этот результат rm -f *.txt будет теперь выполнен из-за обратных запросов. Итак, rm удалит все текстовые файлы, в нашем случае файл rm -f *.txtНадеюсь, вы понимаете, - поскольку демонстрация просто запускает предыдущие команды в пустом каталоге, так что вы ничего не сломаете .
"что делает $(ls *.txt) do"
$(ls *.txt) собирает список имен файлов, а затем управляет ими. Не используйте это.
Давайте создадим 4 файла, содержащие Stuff в нашем каталоге:
$ echo Stuff | tee file1 file2 'a b c.txt' 'f* .txt'
Stuff
$ ls -Q
"a b c.txt" "file1" "file2" "f* .txt"
Теперь давайте запустим команду egrep:
$ egrep "Stuff" $(ls *.txt)
grep: a: No such file or directory
grep: b: No such file or directory
grep: c.txt: No such file or directory
file1:Stuff
file2:Stuff
f* .txt:Stuff
grep: .txt: No such file or directory
Обратите внимание, что мы получаем 4 сообщения об ошибках о несуществующих файлах. Это связано с «что делает $(ls *.txt)» . Результат также показывает совпадения с двумя файлами file1 и file2, которые не должны были быть обысканы, потому что они не заканчиваются на .txt. Это из-за расширения _pathname.
Правильно написанная команда производит два успешных совпадения и отсутствие ошибок:
$ egrep -- "Stuff" *.txt
a b c.txt:Stuff
f* .txt:Stuff
Использование:
egrep -- "Stuff" *.txt
или POSIXly:
grep -E -- "Stuff" *.txt
или:
grep -E -e Stuff -- *.txt
Это будет работать с любым именем файла и не имеет ограничений в ls.
Этот вопрос, похоже, мало полезен в реальном мире, но
. Лучший способ получить полезный результат:
echo $(ls *.txt)
Или просто
ls *.txt
Здесь будут перечислены все файлы с расширением .txt. Чтобы найти текстовые файлы, содержащие определенную строку,
egrep -l "Stuff" *.txt
Для получения дополнительной информации о инструментах поиска сделайте
man egrep
$( ... )
Является заменой команды, она назначает вывод одной или нескольких команд в качестве ввода другой команды. Старый синтаксис: ` ... `.
Различие заключается в том, что ваши команды будут запускаться в разных оболочках:
echo $BASHPID $( echo $BASHPID )
5718 7138
На самом деле он вызывает подоболочку:
echo $BASH_SUBSHELL $( echo $BASH_SUBSHELL )
0 1
Команда $( ) запускает команду ls *.txt и возвращает STDOUT команды.
То, что это конкретное использование, является ошибкой программирования новичков по крайней мере на трех уровнях:
egrep 'Stuff' *.txt работает, как вы сказали, за исключением файлов, названных как-то вроде A File.txt. Выход ls для ввода программы неразумный. См. Причины $( ls *.txt) имена файлов mishandles с пробелами и другими забавными символами. find . -maxdepth 1 -type f -iname '*.txt' -print0 | xargs -0 egrep 'Stuff' является более пуленепробиваемым способом.Надуманный пример расширения / путаницы оболочки оболочки в ответ на @ 8bittree:
$ /bin/ls -l -b
total 36
-rw------- 1 w3 walt 2 Aug 11 13:41 A\ \\012\ File.txt
-rw------- 1 w3 walt 2 Aug 11 13:42 A\ \n\ File.txt
-rw------- 1 w3 walt 2 Aug 11 13:40 A\ File.txt
$ grep "STUFF" $(ls *.txt)
grep: A: No such file or directory
grep: \012: No such file or directory
grep: File.txt: No such file or directory
grep: A: No such file or directory
grep: File.txt: No such file or directory
grep: A: No such file or directory
grep: File.txt: No such file or directory
$ find . -maxdepth 1 -type f -iname '*.txt' -print0 | xargs -0 egrep 'Stuff'
$ find . -maxdepth 1 -type f -iname '*.txt' -print0 | xargs -0 egrep '1'
./A File.txt:1
Ничего себе, на мгновение я подумал, что вы задаетесь вопросом о `$(ls *.txt)` (с $(..) плюс backquotes)
По мере ответа на этот вопрос я просто предупрежу вас об одном. Вот последовательность команд, чтобы показать вам, почему это может быть опасно:
set -x Чтобы увидеть, что выполнено touch 'rm -f *.txt' Создайте текстовый файл с именем «rm -f * .txt», я использую простой цитаты здесь, поэтому Bash не будет расширять подстановочные знаки и пробелы. `$(ls *.txt)` Вот сложная часть. Команда ls *.txt будет запущена, а затем перенаправит результат на STDOUT. Этот результат rm -f *.txt будет теперь выполнен из-за обратных запросов. Итак, rm удалит все текстовые файлы, в нашем случае файл rm -f *.txtНадеюсь, вы понимаете, - поскольку демонстрация просто запускает предыдущие команды в пустом каталоге, так что вы ничего не сломаете .