Что делает голый?

10

bash не жалуется, если вы запускаете такую ​​команду, как

$ < some-file-that-exists

Кажется, ничего не происходит.

Вы также можете использовать

$ <<<"any string"

и даже процесс замещения.

Так что именно это делает, и почему это разрешено. Может ли это быть полезным для чего-либо?

Таблетки взрыва
источник
КСТАТИ: Для великого ZSH, "<foobar" - это то же самое, что и "less foobar", как и перенаправление foobar в оболочку. Я думаю, что это довольно интуитивное поведение. Голый <даст вам ошибку ( zsh: parse error near `\n'), так как аргумент не дается.
математическое
@math вы получите аналогичную ошибку bash, но это интересно less.
Взрыв таблетки

Ответы:

20

<устанавливает перенаправление для команды, которая может происходить до или после инструкций перенаправления. Т.е.

$ < file wc

работает так же как

$ wc < file

Но если вы не даете команду, bash устанавливает перенаправление и больше ничего не делает. Для перенаправления ввода это равносильно тому, что вы видели, ничего, если файл существует и доступен для чтения. Если файл не существует или не читается, bash выдаст ошибку. Для перенаправления вывода, выходной файл будет создан, если он не существует. Любой существующий выходной файл будет усечен, если >используется; нет усечения, если >>используется.

Кайл Джонс
источник
другими словами, они лаконично существуют и создают
чокнутый урод
@ Кайл Джонс Я думаю, вы не совпали с двумя операторами в последнем предложении.
jamesbtate
@Puddingfox Спасибо. Я отредактировал готовое предложение в конце, чтобы уточнить.
Кайл Джонс
Есть ли причина использовать < file wcпротив wc < file?
Таблетки взрыва
1
@tandu Это удобно при использовании интерактивных оболочек. Скажем, у вас есть команда, которая использует перенаправление, и вы хотите повторить ее с другим последним аргументом. Если перенаправление находится в начале строки, легко набрать control-P и затем отредактировать последний аргумент, не пропуская язык «<foo> bar 2> & 1», как если бы он был в конце. Кроме того, я не нашел в этом никакого смысла.
Кайл Джонс
5

<читает из стандартного ввода по умолчанию или из файла. ваше выражение ничего не делает с вводом, потому что вы ничего не делали после прочтения.

если вы в конце сделаете выходной файл <some-file-that-существующие>, то увидите, что вы только что прочитали содержимое первого файла и записали его во второй файл.

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

johnshen64
источник
2
для дальнейшего использования, пожалуйста, отредактируйте свой ответ, чтобы добавить детали вместо добавления комментария
Nate Koppenhaver
2
«если вы сделаете <some-file-that-существующие> outputfile в конце, то вы увидите, что вы только что прочитали содержимое первого файла и записали его во второй файл». Это не верно; без команды выходной файл будет обрезан до нуля байтов.
Кайл Джонс