Используя /dev/stdin и heredoc для передачи файла из командной строки

Оригинальная команда tar в UNIX не сжимала архивы. Как было упомянуто в одном из комментариев, Solaris tar не сжимает. Также как и HP-UX, и AIX, FWIW. По соглашению, несжатые архивы заканчиваются .tar.

В GNU/Linux вы получаете GNU tar. (Вы можете установить GNU tar на другие системы UNIX.) По умолчанию он не сжимает; однако он сжимает полученный архив с помощью gzip (также созданного GNU), если вы поставите -z. Обычный суффикс для gzip-файлов - .gz, поэтому часто встречаются tarballs (жаргонное обозначение архива tar, обычно подразумевающее, что он был сжат), которые заканчиваются .tar.gz. Такое окончание означает, что был запущен tar, а затем gzip, например, tar cf - .|gzip -9v > archive.tar.gz. Вы также найдете архивы, заканчивающиеся на .tgz, например, tar czf archive.tgz . .

Редактировать: www.linfo.org/tar.html напомнил мне, что GNU tar поддерживает гораздо больше функций, чем просто сжатие с помощью gzip, и напомнил мне, что суффиксы - это не просто условности. Они имеют встроенную семантику. Он также поддерживает bzip2 (-j для .bz2) и старый compress (-Z для .Z). Затем я заглянул на страницу man и вспомнил, что -a автоматически определяет желаемый метод сжатия на основе суффикса.

Еще одно замечание. Как сказано на странице Linux tar man page, GNU выпускает информационные страницы, а не man pages, поэтому, чтобы узнать все о GNU tar, запустите info tar.

3
19.02.2018, 23:13
1 ответ

Un documento aquí -es una redirección a la entrada estándar de un comando, al igual que <. Esto significa que en cualquier lugar donde pueda usar <para redirigir el contenido de un archivo, puede redirigir el contenido de un documento aquí -. El estándar POSIX enumera aquí -documentos junto con los otros operadores de redirección .

En su ejemplo de Ansible, ansible-playbookno lee de forma predeterminada su flujo de entrada estándar, ya que espera un nombre de archivo. Al darle /dev/stdincomo nombre de archivo y luego proporcionar el documento aquí -en la entrada estándar, elude esta restricción en la utilidad. El "archivo" /dev/stdinsiempre contendrá el flujo de datos de entrada estándar del proceso actual.

rubyy awk, así como muchas otras utilidades, leerán la entrada estándar a menos que se proporcione un nombre de archivo en la línea de comando.

Entonces, está técnicamente equivocado cuando dice "Parece que el shell piensa que el heredoc es un archivo con un contenido igual al valor del heredoc". No actúa como un archivo (con respecto a tener un nombre de archivo y ser buscable ), sino como un flujo de datos en la entrada estándar. Al menos desde el punto de vista de la utilidad.

La diferencia es la misma que entre

cat file

y

cat <file

En la primera instancia, catabre el archivo file, pero en la segunda (que es también lo que sucede con un documento here -), ya que no se dio ningún nombre de archivo como argumento para cat, catsimplemente lee su flujo de entrada estándar (y shell abre el archivo, o proporciona el documento aquí -, en la entrada estándar a la utilidad ). La utilidad no necesita saber si los datos proporcionados provienen de un archivo, una canalización, un documento aquí -o alguna otra fuente de datos.

Cómo aquí -los documentos son implementados por el shell es de alguna manera poco importante, pero puede ser a través del uso de un FIFO o incluso con un archivo temporal.

4
27.01.2020, 21:10

Теги

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