Каким образом цитирование параметров для `поиска` имеет значение? [дубликат]

Узел устройства указывает на одно устройство, которое в Linux обрабатывается ядром. Когда bash читает из /dev/tty1, он читает из драйвера устройства, управляющего первым терминалом; когда он пишет в него, он пишет в тот же драйвер устройства.

0
16.02.2017, 01:46
2 ответа

Это ожидаемое поведение - оно известно как «подстановка оболочки». Без кавычек *. Txt расширяется оболочкой для передачи всего списка файлов, соответствующих этому выражению, команде find . Заключив его в кавычки, вы указываете оболочке передать буквальную строку *. Txt в find . Вы можете добиться такой же защиты, используя другие методы экранирования, такие как find. -имя \*.txt или найти. -name '* .txt' .

1
28.01.2020, 02:25

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

Это означает, что при вводе find. -name "* .txt" -print , тогда find получает литерал *. txt в качестве одного из своих параметров и использует этот шаблон в качестве аргумента на его параметр -name , который будет сопоставлять имена файлов, найденных для него перед применением -print .

С другой стороны, при вводе найти. -name * .txt -print , оболочка передает расширенную версию *. txt для поиска. Возможны несколько случаев :

  1. В текущем каталоге нет файлов, соответствующих *. Txt : find получает литерал *. Txt (предполагая настройки bash по умолчанию);

  2. в текущем каталоге есть ровно один файл, соответствующий *. txt ; допустим, это a.txt : find получает это имя файла, и сопоставляет все файлы с именем a.txt , найденные, начиная с текущего каталога ;

  3. несколько файлов соответствуют *. Txt в текущем каталоге (это похоже на в вашем случае): -name получает первый в качестве параметра, и другие - это дополнительные параметры пути, которые необходимо найти, в котором сообщается о том, что перед выражением не указаны все пути.

Это ожидаемое поведение.


Предположим следующую иерархию файлов:

.
├── a.txt
├── b.txt
├── c.txt
└── foo
    ├── a.txt
    ├── b.txt
    └── c.txt

Фактические параметры, которые find получает в случае eah, можно просмотреть , заменив вызов find на printf '% s \ n' , который напечатает каждый расширенный аргумент в отдельной строке:

$ printf '%s\n' . -name "*.txt" -print
.
-name
*.txt
-print

$ printf '%s\n' . -name *.txt -print
.
-name
a.txt
b.txt
c.txt
-print

Как видите, второй опубликованный вами вызов эквивалентен с учетом существующих файлов find. -name a.txt b.txt c.txt -print .

2
28.01.2020, 02:25

Теги

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