Поиск и проблемы с bash в последних версиях Ubuntu

У меня была проблема последние шесть месяцев или около того при объединении поисковых запросов в 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.

2
задан 12 May 2011 в 17:52

36 ответов

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).

Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:

grep -l  psycopg $(find . -name '*.py')
ls -l $(!!)

В этом случае он может быть вложен.

6
ответ дан 25 May 2018 в 21:06

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).

Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:

grep -l psycopg $(find . -name '*.py') ls -l $(!!)

В этом случае он может быть вложен.

6
ответ дан 25 July 2018 в 21:56

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).

Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:

grep -l psycopg $(find . -name '*.py') ls -l $(!!)

В этом случае он может быть вложен.

6
ответ дан 26 July 2018 в 17:56

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).

Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:

grep -l psycopg $(find . -name '*.py') ls -l $(!!)

В этом случае он может быть вложен.

6
ответ дан 2 August 2018 в 03:31

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg).

Вы можете избежать этой проблемы, используя синтаксис $(command) для подстановок команд:

grep -l psycopg $(find . -name '*.py') ls -l $(!!)

В этом случае он может быть вложен.

6
ответ дан 4 August 2018 в 19:28

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg ).

Вы можете избежать этой проблемы, используя $ (команда) синтаксис для подстановок команд:

  grep -l psycopg $ (find. -name '* .py') ls -l $ (!!)   

В этом случае он может быть вложен.

6
ответ дан 6 August 2018 в 03:38

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg ).

Вы можете избежать этой проблемы, используя $ (команда) синтаксис для подстановок команд:

  grep -l psycopg $ (find. -name '* .py') ls -l $ (!!)   

В этом случае он может быть вложен.

6
ответ дан 7 August 2018 в 21:29

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg ).

Вы можете избежать этой проблемы, используя $ (команда) синтаксис для подстановок команд:

  grep -l psycopg $ (find. -name '* .py') ls -l $ (!!)   

В этом случае он может быть вложен.

6
ответ дан 10 August 2018 в 09:46

Проблема заключается в вложенной подстановке команд с обратными выводами. bash сначала пытается выполнить grep -l psycopg (который находится между первыми двумя обратными выводами). Но нет имени файла, поэтому он ожидает ввода на stdin (вы можете попробовать это, введя psycopg ).

Вы можете избежать этой проблемы, используя $ (команда) синтаксис для подстановок команд:

  grep -l psycopg $ (find. -name '* .py') ls -l $ (!!)   

В этом случае он может быть вложен.

6
ответ дан 13 August 2018 в 16:00

Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.

ls -l $(grep -l psycopg $(find . -name \*py))
5
ответ дан 25 May 2018 в 21:06
  • 1
    И тебе спасибо. Смешно, что, как я заметил, они использовали для гнезда - или, по крайней мере, я думаю, что они это сделали, я использовал эту технику в течение многих лет. Но это правда, я приобрел привычку использовать backtips назад, когда я все еще использовал tcsh. Вместо этого нужно привыкнуть к $ (...). – Carsten Agger 12 May 2011 в 18:50
  • 2
    Upvote. Просто примечание: IIRC / bin / bash по умолчанию Ubuntu на самом деле тире не настоящий bash. Это может быть частью того, почему они больше не гнездится должным образом. – RobotHumans 2 April 2012 в 05:26
  • 3
    @ aking1012, вы имеете в виду /bin/sh тире. – glenn jackman 2 April 2012 в 17:51
  • 4
    Да. Ты прав. – RobotHumans 2 April 2012 в 17:59

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

find . -name '*.py' -exec grep -q psycopg {} ";" -ls

возможные формы вывода (printf) и перечислены в man-странице найти.

5
ответ дан 25 May 2018 в 21:06

Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.

Также читайте http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.

И нет,

ls -l `grep -l psycopg `find . -name '*.py'``

не мог работали и в более ранних версиях.

Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.

1
ответ дан 25 July 2018 в 21:56

Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.

ls -l $(grep -l psycopg $(find . -name \*py))
5
ответ дан 25 July 2018 в 21:56
  • 1
    И тебе спасибо. Смешно, что, как я заметил, они использовали для гнезда - или, по крайней мере, я думаю, что они это сделали, я использовал эту технику в течение многих лет. Но это правда, я приобрел привычку использовать backtips назад, когда я все еще использовал tcsh. Вместо этого нужно привыкнуть к $ (...). – Carsten Agger 12 May 2011 в 18:50
  • 2
    Upvote. Просто примечание: IIRC / bin / bash по умолчанию Ubuntu на самом деле тире не настоящий bash. Это может быть частью того, почему они больше не гнездится должным образом. – RobotHumans 2 April 2012 в 05:26
  • 3
    @ aking1012, вы имеете в виду /bin/sh тире. – glenn jackman 2 April 2012 в 17:51
  • 4
    Да. Ты прав. – RobotHumans 2 April 2012 в 17:59

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

find . -name '*.py' -exec grep -q psycopg {} ";" -ls

возможные формы вывода (printf) и перечислены в man-странице найти.

5
ответ дан 25 July 2018 в 21:56

Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.

Также читайте http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.

И нет,

ls -l `grep -l psycopg `find . -name '*.py'``

не мог работали и в более ранних версиях.

Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.

1
ответ дан 26 July 2018 в 17:56

Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.

ls -l $(grep -l psycopg $(find . -name \*py))
5
ответ дан 26 July 2018 в 17:56
  • 1
    И тебе спасибо. Смешно, что, как я заметил, они использовали для гнезда - или, по крайней мере, я думаю, что они это сделали, я использовал эту технику в течение многих лет. Но это правда, я приобрел привычку использовать backtips назад, когда я все еще использовал tcsh. Вместо этого нужно привыкнуть к $ (...). – Carsten Agger 12 May 2011 в 18:50
  • 2
    Upvote. Просто примечание: IIRC / bin / bash по умолчанию Ubuntu на самом деле тире не настоящий bash. Это может быть частью того, почему они больше не гнездится должным образом. – RobotHumans 2 April 2012 в 05:26
  • 3
    @ aking1012, вы имеете в виду /bin/sh тире. – glenn jackman 2 April 2012 в 17:51
  • 4
    Да. Ты прав. – RobotHumans 2 April 2012 в 17:59

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

find . -name '*.py' -exec grep -q psycopg {} ";" -ls

возможные формы вывода (printf) и перечислены в man-странице найти.

5
ответ дан 26 July 2018 в 17:56

Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.

Также читайте http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.

И нет,

ls -l `grep -l psycopg `find . -name '*.py'``

не мог работали и в более ранних версиях.

Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.

1
ответ дан 2 August 2018 в 03:31

Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.

ls -l $(grep -l psycopg $(find . -name \*py))
5
ответ дан 2 August 2018 в 03:31
  • 1
    И тебе спасибо. Смешно, что, как я заметил, они использовали для гнезда - или, по крайней мере, я думаю, что они это сделали, я использовал эту технику в течение многих лет. Но это правда, я приобрел привычку использовать backtips назад, когда я все еще использовал tcsh. Вместо этого нужно привыкнуть к $ (...). – Carsten Agger 12 May 2011 в 18:50
  • 2
    Upvote. Просто примечание: IIRC / bin / bash по умолчанию Ubuntu на самом деле тире не настоящий bash. Это может быть частью того, почему они больше не гнездится должным образом. – RobotHumans 2 April 2012 в 05:26
  • 3
    @ aking1012, вы имеете в виду /bin/sh тире. – glenn jackman 2 April 2012 в 17:51
  • 4
    Да. Ты прав. – RobotHumans 2 April 2012 в 17:59

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

find . -name '*.py' -exec grep -q psycopg {} ";" -ls

возможные формы вывода (printf) и перечислены в man-странице найти.

5
ответ дан 2 August 2018 в 03:31

Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $() или `` (подмена команды). См. Http://mywiki.wooledge.org/ParsingLs для объяснения причин, почему вы не должны этого делать.

Также читайте http://mywiki.wooledge.org/ParsingLs и http://mywiki.wooledge.org/BashFAQ/020 о том, как правильно использовать поиск и иметь дело с именами файлов.

И нет,

ls -l `grep -l psycopg `find . -name '*.py'``

не мог работали и в более ранних версиях.

Ответ пользователя неизвестен показывает хороший и безопасный способ выполнить задание, о котором вы просили.

1
ответ дан 4 August 2018 в 19:28

Backticks не гнездятся. Первая внедренная команда grep -l psycopg, которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привыкнуть к использованию $(this syntax) вместо обратных тактов, потому что они правильно гнездятся.

ls -l $(grep -l psycopg $(find . -name \*py))
5
ответ дан 4 August 2018 в 19:28
  • 1
    И тебе спасибо. Смешно, что, как я заметил, они использовали для гнезда - или, по крайней мере, я думаю, что они это сделали, я использовал эту технику в течение многих лет. Но это правда, я приобрел привычку использовать backtips назад, когда я все еще использовал tcsh. Вместо этого нужно привыкнуть к $ (...). – Carsten Agger 12 May 2011 в 18:50
  • 2
    Upvote. Просто примечание: IIRC / bin / bash по умолчанию Ubuntu на самом деле тире не настоящий bash. Это может быть частью того, почему они больше не гнездится должным образом. – RobotHumans 2 April 2012 в 05:26
  • 3
    @ aking1012, вы имеете в виду /bin/sh тире. – glenn jackman 2 April 2012 в 17:51
  • 4
    Да. Ты прав. – RobotHumans 2 April 2012 в 17:59

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

find . -name '*.py' -exec grep -q psycopg {} ";" -ls

возможные формы вывода (printf) и перечислены в man-странице найти.

5
ответ дан 4 August 2018 в 19:28

Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $ () или `` (подстановка команды). См. [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'``  

не мог работать и в более ранних версиях.

Ответ пользователя неизвестен показывает хороший и безопасный способ сделать задание, о котором вы спрашивали.

1
ответ дан 6 August 2018 в 03:38

Backticks не гнездятся. Первая встроенная команда: grep -l psycopg , которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привык к использованию $ (этот синтаксис) вместо backticks, потому что они правильно вписываются.

  ls -l $ (grep -l psycopg $ (find. -name \ * py))  
5
ответ дан 6 August 2018 в 03:38

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

  find.  -name '* .py' -exec grep -q psycopg {} ";"  -l  

возможны специальные формы вывода (printf) и перечислены в справочной странице find.

5
ответ дан 6 August 2018 в 03:38

Backticks не гнездятся. Первая встроенная команда: grep -l psycopg , которая будет прослушивать stdin для данных, потому что нет имен файлов.

Я бы сказал, что привык к использованию $ (этот синтаксис) вместо backticks, потому что они правильно вписываются.

  ls -l $ (grep -l psycopg $ (find. -name \ * py))  
5
ответ дан 7 August 2018 в 21:29

Сделайте это, в общем, наоборот, найдите в них файлы, grep и используйте наборы ls:

  find.  -name '* .py' -exec grep -q psycopg {} ";"  -l  

возможны специальные формы вывода (printf) и перечислены в справочной странице find.

5
ответ дан 7 August 2018 в 21:29

Всегда неправильно иметь команды, которые выводят более одного имени файла внутри $ () или `` (подстановка команды). См. [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'``  

не мог работать и в более ранних версиях.

Ответ пользователя неизвестен показывает хороший и безопасный способ сделать задание, о котором вы спрашивали.

1
ответ дан 7 August 2018 в 21:29

Другие вопросы по тегам:

Похожие вопросы: