Почему следующая команда bash не работает должным образом?

У меня есть следующая команда bash:

$(ls -l /var/ | grep www) > cat folder_exists

, но она не работает должным образом. Я надеюсь достичь команды, которая проверяет, есть ли папка www внутри папки /var/, и выводит результат этой конкретной команды в файл folder_exists. Я также пытался многократно вводить команду, например,

cat $(ls -l /var/ | grep www) > folder_exists

или даже

cat $(ls -l /var | grep www) > folder_exists

на случай, если удар коснулся, но безрезультатно.

Моя проблема в том, что, хотя я создаю файл folder_exists, мне не удается распечатать вывод на него. Может кто-нибудь показать мне, где я ошибся?

2
задан 10 September 2012 в 09:05

4 ответа

Лучше сделайте это:

if [ -d /var/www ] ; then touch folder_exists ; else touch folder_absent ; fi

Первая версия команды делает следующее: $( ... ) сначала заменяется тем, что было произведено .... Так как Вы называете ls-l | grep www, Вы или получаете строку с несколькими словами или ничем. В первом случае это предпринято, чтобы быть выполненным, но это имеет мало смысла. Что Вы получите, если Вы введете

drwxr-xr-x 15 root root     4096 Aug 20 13:48 log

в командной строке? Нет никакой названной команды drwxr-xr-x. Если Вы используете cat $( ls -l /var | grep www) форма, затем сначала $( ... ) заменяется тем, что было произведено ..., затем кошка интерпретирует его как список файлов кошке (запускающийся с drwxr-xr-x; скорее всего, нет такого файла).

Кроме того, при попытке сделать что-то как этот:

command > cat file

То, что произойдет, является этим cat интерпретируется как имя файла для хранения вывода command, и не как команда. Интерпретировать cat как команда, Вам нужен знак канала, как Вы правильно используемый в ls | grep:

command | cat

Однако, если Ваша цель состоит в том, чтобы сохранить вывод команды в файле, то просто используют

command > file

На самом деле, Вы могли сделать

ls /var | grep www > file

Этот файл будет пуст, только если нет никакой www папки в ls. Но остерегайтесь! если будет папка,/var/ewwwocks, то файл будет также содержать строку. Лучше использовать просто

ls /var/www > file

Короче говоря, используйте условную конструкцию если...; затем...; еще...; fi

8
ответ дан 10 September 2012 в 09:05

Удалите круглую скобку.

 ls -l /var/ | grep www > folder_exists

Работает просто великолепно.

1
ответ дан 10 September 2012 в 09:05

-l аргумент ls причины это для включения большой посторонней информации, которая испачкает grep. Корректная команда была бы ls -a /var/ | grep www > folder_exists.

1
ответ дан 10 September 2012 в 09:05

Я предложил бы использовать find для такой задачи:

find /var -type d -name '*www*' -maxdepth 1
  • -name '*www*' соответствия что-либо назвало что-то с www, используйте -iname, если соответствие должно быть нечувствительным к регистру.
  • find является рекурсивным по умолчанию, таким образом, maxdepth опция гарантирует, что только /var/*www* подобраны.
  • -type d указывает, что это должен быть каталог.
1
ответ дан 10 September 2012 в 09:05

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

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