У меня была проблема последние шесть месяцев или около того при объединении поисковых запросов в bash. Точный пример связан с программированием на Python, но применим к любому обнаружению / манипуляции.
Предположим, что мне нужен список всех файлов Python в каталоге, где я есть. Это легко:
find . -name '*.py'
Теперь предположим, что меня интересуют только те файлы Python, которые содержат строку «psycopg», например. потому что я хочу перейти из старой библиотеки доступа PostgreSQL psycopg к psycopg2. Все еще достаточно легко:
grep -l psycopg `find . -name '*.py'`
Теперь предположим, что я хочу сделать полный список этих файлов, чтобы проверить их штампы даты, чтобы увидеть, когда я последний раз их касался. Я также хотел бы открыть их в gedit, но давайте придерживаться списка:
ls -l `!!`
, который расширяется до
ls -l `grep -l psycopg `find . -name '*.py'``
Теперь, что происходит? Ответ: Ничего. Приглашение bash просто зависает. Почему это? Это может быть неправильный способ делать что-то, но он работал. Я уверен, что он работал до Ubuntu 10.10 или 10.04.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).
Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:
grep -l psycopg $(find . -name '*.py')
ls -l $(!!)
В этом случае он может быть вложен.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).
Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:
grep -l psycopg $(find . -name '*.py')
ls -l $(!!)
В этом случае он может быть вложен.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).
Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:
grep -l psycopg $(find . -name '*.py')
ls -l $(!!)
В этом случае он может быть вложен.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).
Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:
grep -l psycopg $(find . -name '*.py')
ls -l $(!!)
В этом случае он может быть вложен.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).
Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:
grep -l psycopg $(find . -name '*.py')
ls -l $(!!)
В этом случае он может быть вложен.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash
сначала пытается выполнить grep -l psycopg
(который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin
(вы можете попробовать это, введя psycopg
).
Вы можете избежать этой проблемы, используя $ (команда)
синтаксис для подстановок команд:
grep -l psycopg $ (find. -name '* .py') ls -l $ (!!)
В этом случае он может быть вложен.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash
сначала пытается выполнить grep -l psycopg
(который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin
(вы можете попробовать это, введя psycopg
).
Вы можете избежать этой проблемы, используя $ (команда)
синтаксис для подстановок команд:
grep -l psycopg $ (find. -name '* .py') ls -l $ (!!)
В этом случае он может быть вложен.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash
сначала пытается выполнить grep -l psycopg
(который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin
(вы можете попробовать это, введя psycopg
).
Вы можете избежать этой проблемы, используя $ (команда)
синтаксис для подстановок команд:
grep -l psycopg $ (find. -name '* .py') ls -l $ (!!)
В этом случае он может быть вложен.
Проблема заключается в вложенной подстановке команд с обратными выводами. bash
сначала пытается выполнить grep -l psycopg
(который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin
(вы можете попробовать это, введя psycopg
).
Вы можете избежать этой проблемы, используя $ (команда)
синтаксис для подстановок команд:
grep -l psycopg $ (find. -name '* .py') ls -l $ (!!)
В этом случае он может быть вложен.
Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.
ls -l $(grep -l psycopg $(find . -name \*py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find . -name '*.py' -exec grep -q psycopg {} ";" -ls
возможные формы вывода (printf) и перечислены в man-странице найти.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.
И нет,
ls -l `grep -l psycopg `find . -name '*.py'``
не мог работали и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.
Также читайте http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.
И нет,
ls -l `grep -l psycopg `find . -name '*.py'``
не мог работали и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.
Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.
ls -l $(grep -l psycopg $(find . -name \*py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find . -name '*.py' -exec grep -q psycopg {} ";" -ls
возможные формы вывода (printf) и перечислены в man-странице найти.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.
Также читайте http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.
И нет,
ls -l `grep -l psycopg `find . -name '*.py'``
не мог работали и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.
Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.
ls -l $(grep -l psycopg $(find . -name \*py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find . -name '*.py' -exec grep -q psycopg {} ";" -ls
возможные формы вывода (printf) и перечислены в man-странице найти.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.
Также читайте http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.
И нет,
ls -l `grep -l psycopg `find . -name '*.py'``
не мог работали и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.
Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.
ls -l $(grep -l psycopg $(find . -name \*py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find . -name '*.py' -exec grep -q psycopg {} ";" -ls
возможные формы вывода (printf) и перечислены в man-странице найти.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.
Также читайте http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.
И нет,
ls -l `grep -l psycopg `find . -name '*.py'``
не мог работали и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.
Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.
ls -l $(grep -l psycopg $(find . -name \*py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find . -name '*.py' -exec grep -q psycopg {} ";" -ls
возможные формы вывода (printf) и перечислены в man-странице найти.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $ ()
или ``
(подстановка команды). См. [D0] http://mywiki.wooledge.org/ParsingLs для объяснения, почему вы не должны этого делать.
Также читайте http: //mywiki.wooledge .org / UsingFind и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.
И нет,
ls -l `grep -l psycopg` find. -name '* .py'``
не мог работать и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ сделать задание, о котором вы спрашивали.
Backticks не гнездятся. Первая встроенная команда: grep -l psycopg
, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привык к использованию $ (этот синтаксис)
вместо backticks, потому что они правильно вписываются.
ls -l $ (grep -l psycopg $ (find. -name \ * py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find. -name '* .py' -exec grep -q psycopg {} ";" -l
возможны специальные формы вывода (printf) и перечислены в справочной странице find.
Backticks не гнездятся. Первая встроенная команда: grep -l psycopg
, которая будет прослушивать stdin для данных, потому что нет имен файлов.
Я бы сказал, что привык к использованию $ (этот синтаксис)
вместо backticks, потому что они правильно вписываются.
ls -l $ (grep -l psycopg $ (find. -name \ * py))
Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:
find. -name '* .py' -exec grep -q psycopg {} ";" -l
возможны специальные формы вывода (printf) и перечислены в справочной странице find.
Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $ ()
или ``
(подстановка команды). См. [D0] http://mywiki.wooledge.org/ParsingLs для объяснения, почему вы не должны этого делать.
Также читайте http: //mywiki.wooledge .org / UsingFind и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.
И нет,
ls -l `grep -l psycopg` find. -name '* .py'``
не мог работать и в более ранних версиях.
Ответ пользователя неизвестен показывает хороший и безопасный способ сделать задание, о котором вы спрашивали.