Существуют ли функциональные различия между bash / zsh <<< «$ (

Упростите использование last отображение записей завершения работы системы и уровня выполнения изменяются и фильтрация на shutdown и reboot:

last -x shutdown reboot
2
30.10.2015, 14:38
2 ответа

В <<< "$ ( (поддерживается zsh (где <<< ] впервые был введен, вдохновленный тем же оператором в порту Unix rc ), ksh93 (оператор $ ( был введен ksh ), mksh и bash ),

Для $ ( оболочка считывает содержимое файла (блокирует NUL байтов, кроме для zsh ), удаляет все завершающие символы новой строки, что приводит к расширению $ ( (таким образом, содержимое файла сохраняется в памяти как единое целое).

Для <<< some-text оболочка сохраняет some-text , за которым следует один символ новой строки, во временный файл, и открывает этот временный файл в файловом дескрипторе 0.

Таким образом, в основном <<< "$ ( открывает стандартный ввод для чтения во временной копии файла , где конечные символы новой строки были заменены только одним (и с различные виды неправильного поведения, если файл содержит байты NUL, кроме zsh ).

В то время как в <файл , это файл , который напрямую открывается для чтения на стандартном вводе.

Конечно, намного эффективнее (не требует копирования на диск и в память), но можно использовать <<< "$ (, чтобы убедиться, что файл, открытый на stdin, является обычным файлом, или чтобы убедиться, что файл был полностью прочитан к моменту запуска команды (в случае, если эта команда записывает в него, например ) или обрабатывается другое перенаправление (например, такое перенаправление, которое усекает файл , как в tr 1 2 <<< "$ ( file ).

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

4
27.01.2020, 21:54

Все эти команды будут записывать (txt) (не пытайтесь использовать это в двоичных файлах) содержимое файла:

cat        file
cat       <file
echo   "$(<file)"
cat <<<"$(<file)"

Но это потому, что cat - очень адаптируемая команда, а не потому, что команды равны.

  1. Команда cat file распечатывает содержимое файла, в данном случае cat работает с реальным файлом. Аналогичен less file . Но чем меньше, тем строже, нужен настоящий файл.

  2. Команда cat передает содержимое файла (уже извлеченного как поток) в cat, cat получает поток из стандартного ввода. Но у cat с этим нет проблем, он также печатает поток, и мы видим тот же результат.

  3. В этом случае echo "$ (<файл)" , "$ (<файл)" в точности равно (за исключением некоторых деталей вспомогательной оболочки) ] "$ (файл кошки)" . Это означает, что выполняется команда cat. Затем его вывод преобразуется в текстовую строку при выполнении команды $ (...) , и, наконец, эта текстовая строка печатается с помощью echo. Снова видим содержимое файла.

  4. Команда cat <<< "$ (<файл)" следует этой последовательности:

    • "$ (<файл)" файл читается и выводится как строка

    • <<< отправляет строку на стандартный ввод (stdin)

    • , а cat печатает то, что получает на своем входе (stdin).

Мы видим то же содержимое файла.

Заключение

Мы видим один и тот же вывод во всех случаях. Но содержимое файла меняется в зависимости от того, "что оно есть" (имя файла, поток, строка и т. Д.) В каждой части команды.

2
27.01.2020, 21:54

Теги

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