Узел устройства указывает на одно устройство, которое в Linux обрабатывается ядром. Когда bash
читает из /dev/tty1
, он читает из драйвера устройства, управляющего первым терминалом; когда он пишет в него, он пишет в тот же драйвер устройства.
Это ожидаемое поведение - оно известно как «подстановка оболочки». Без кавычек *. Txt
расширяется оболочкой для передачи всего списка файлов, соответствующих этому выражению, команде find
. Заключив его в кавычки, вы указываете оболочке передать буквальную строку *. Txt
в find
. Вы можете добиться такой же защиты, используя другие методы экранирования, такие как find. -имя \*.txt
или найти. -name '* .txt'
.
Внутри токена, который не заключен в кавычки, раскрытие будет выполнять ваша оболочка, а не команда, которую вы выполняете.
Это означает, что при вводе find. -name "* .txt" -print
, тогда
find получает литерал *. txt
в качестве одного из своих параметров и использует
этот шаблон в качестве аргумента на его параметр -name
, который будет сопоставлять
имена файлов, найденных для него перед применением -print
.
С другой стороны, при вводе найти. -name * .txt -print
, оболочка
передает расширенную версию *. txt
для поиска. Возможны несколько случаев
:
В текущем каталоге нет файлов, соответствующих *. Txt
: find
получает литерал *. Txt
(предполагая настройки bash по умолчанию);
в текущем каталоге
есть ровно один файл, соответствующий *. txt
; допустим, это a.txt
: find получает это имя файла,
и сопоставляет все файлы с именем a.txt
, найденные, начиная с текущего каталога
;
несколько файлов соответствуют *. 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
.