Когда пустая строка обозначает текущий каталог?

Попробуйте как это:

java -version 2>&1 | grep version  | awk '{print $NF}'

Похож на вывод, идет в stderr.

Кроме того, grep не нужен:

java -version 2>&1 | awk '/version/{print $NF}'
8
12.10.2014, 04:01
6 ответов

Давным-давно (в 7-е издание , 32V , 4.2BSD , 4.3BSD ), на уровне системного вызова. Учебное значение нулевой длины обозначало текущий рабочий каталог (при использовании для поиска; он был запрещен при попытке создавать или удалить файл или каталог). В Система III , это была ошибка для использования пути к нулевой длине при любых обстоятельствах, а стандарт POSIX , чтобы сказать о разрешении PathName:

NULL PATHNAME не должен быть успешно решен.

11
27.01.2020, 20:08

Существуют различные трюки, которые вы можете использовать, чтобы получить вывод Find без ведущих ./ :

  1. Использование Find's -Printf только печатать % f . Смотри Человек Найти :

    Имя файла F файла с любыми ведущими каталогами удалены (только последний элемент).

    Например:

     Найти.  -Нам »* .h" -printf "% f \ n"
     
  2. Разбор вывода:

     Найти.  -Нам "* .h" |  Sed's # ^. / ## '
     
  3. @ Хитрость Антона

     Найти * -Нам "* .h"
     

Что касается другого вопроса, пустая строка никогда не обозначает текущий каталог. Это только в том, что различные программы принимают текущий каталог как значение по умолчанию, поэтому, когда вы запустите их без аргументов, выполняются в текущем каталоге.

0
27.01.2020, 20:08

Если файлы в текущем каталоге, вы можете просто использовать LS :

$ ls *.sh

, если вы Хотите файлы в подкаталогах и просто нужно имя файла, которое вы можете сделать что-то вроде:

$ find . -name '*.h' -exec basename {} \;

Есть команды, которые будут получать отсутствие строки в качестве текущего каталога, но в основном, потому что они получит текущий каталог по умолчанию, если ничего не введено Отказ . всегда обозначает текущий DIR (и .. Родительский каталог)

0
27.01.2020, 20:08

Можно использовать:

find * -name "*.h"

Обратите внимание, что файлы в текущей директории, имя которой начинается с . будет опущено, а файлы, чье имя начинается с -, будут интерпретированы как опции с помощью find и вызовут хаос, поэтому это не является общим эквивалентом find . ….

Отсутствие строки, заканчивающейся на "/" как части имени файла подразумевает текущий каталог, но это не означает, что текущий каталог обозначается обозначается пустой строкой (что, вероятно, не то же самое, что отсутствие строки, хотя она может выглядеть одинаково при печати).

4
27.01.2020, 20:08

Не могу вспомнить ни одного примера, где пустая строка обозначает текущую директорию . . Вы можете думать о вызовах типа ls, но это потому, что ls предполагает текущую директорию, если нет параметра , и на самом деле она не будет принимать пустую строку:

ulmi@silberfisch:~$ ls ""
ls: cannot access : No such file or directory
2
27.01.2020, 20:08

В общем случае пустая строка не обозначает текущий каталог ни в командах оболочки, ни в системных вызовах. В некоторых старых системах это так, но не в POSIX-совместимых системах.

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

Лучше всего было бы оставить ./. Это не принесет никакого вреда.

Если список файлов для

find . … | sed 's!^\./!!'

Обратите внимание, что это искажает некоторые имена файлов, содержащие новые строки. Обычно это не является проблемой для человеческого потребления, а вывод find не подходит для программного потребления, поскольку он неоднозначен. Если вы используете -print0, который подходит для использования в программах, то, вероятно, вам все равно не важен префикс ./.

Вы можете использовать find * ... вместо find . ..., но учтите, что find * имеет ряд недостатков, которые делают его непригодным в общем случае:

  • . опущен.
  • Все точечные файлы (файлы, имя которых начинается с . или ..`) опускаются.
  • Если в текущем каталоге есть файл, имя которого начинается с - (или файл с именем ! или (...), оно будет интерпретировано как опция или предикат командой find.

Первый пункт не имеет значения, если ваш фильтр исключает текущий каталог. Что касается второго пункта, вы можете использовать шаблоны ...?* .[!..]* * * для поиска всех файлов в текущем каталоге, но вам нужно будет проверить, соответствует ли каждый шаблон хотя бы одному файлу, и опустить его, если нет. Это возможно, но очень громоздко. Последний пункт - это стопор. Поэтому find * может подойти для быстрого использования в командной строке, но не используйте его в сценарии.

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

printf '%s\n' **/*.h

Она должна быть активирована shopt -s globstar в bash и set -o globstar в ksh93, и не существует в базовой POSIX оболочке, такой как dash. Точечные файлы по умолчанию не обходятся; чтобы включить их, сначала заставьте globbing не игнорировать точечные файлы с помощью shopt -s dotglob в bash или FIGNORE='@(.|...)' в ksh93. Также, если совпадений нет, то эта команда выводит шаблон; выполните shopt -s nullglob в bash, чтобы вывести пустую строку, и используйте шаблон ~(N)**/*.h в ksh.

В zsh рекурсивное глобирование включено по умолчанию. Используйте квалификатор glob D для включения точечных файлов и N для печати пустой строки при отсутствии совпадений (по умолчанию zsh выдает ошибку, если шаблон не соответствует ни одному файлу). Вы можете использовать printf, как указано выше, или

print -rl -- **/*.h(DN)
4
27.01.2020, 20:08

Теги

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