Если оператор работает с [, но не с [[ при сравнении строк с -eq

Это зависит от возможностей приложения. Он может настаивать или не настаивать на именованном файле, а может и не настаивать на доступном для поиска файле.

Анонимный канал

Некоторые приложения просто считывают ввод откуда угодно. Обычно они по умолчанию читают со стандартного ввода. Если у вас есть данные в виде строки и вы хотите передать их на стандартный ввод приложения, есть несколько способов. Вы можете передать информацию через канал:

printf '%s' "$the_recipe" | cook     # passes $the_recipe exactly
printf '%s\n' "$the_recipe" | cook   # passes $the_recipe plus a final newline

Не используйте здесь echo, потому что в зависимости от оболочки это может исказить обратную косую черту.

Если приложение настаивает на файловом аргументе, оно может принять -за стандартный ввод. Это общепринятое соглашение, но не систематическое.

printf '%s\n' "$the_recipe" | cook -

Если приложению требуется фактическое имя файла, передайте /dev/stdinдля обозначения стандартного ввода.

printf '%s\n' "$the_recipe" | cook /dev/stdin

Для некоторых приложений даже этого недостаточно :им нужно имя файла с определенными свойствами, например с заданным расширением, или им нужно имя файла в доступном для записи каталоге, где они создают временные файлы. В таких случаях обычно требуется временный файл, хотя иногда достаточно именованного канала.

Именованный канал

Каналу можно дать имя. Я упоминаю об этом для полноты картины, но это редко самый удобный способ. Это позволяет избежать получения данных на диске. Это подходит, если приложению требуется файл с ограничениями на имя, но не требуется, чтобы файл был доступен для поиска.

mkfifo named.pipe
printf '%s\n' "$the_recipe" >named.pipe & writer=$!
cook named.pipe
rm named.pipe
wait "$writer"

(Проверка ошибок не выполняется.)

Временный файл

Если приложению требуется доступный для поиска файл, необходимо создать временный файл. Файл с возможностью поиска — это файл, в котором приложение может перемещаться вперед и назад, считывая произвольные части за раз. Канал не позволяет этого :, его нужно читать от начала до конца последовательно,никогда не возвращаясь назад.

Bash, ksh и zsh имеют удобный синтаксис для передачи строки в качестве входных данных через временный файл. Обратите внимание, что они всегда добавляют новую строку к строке (, даже если она уже есть ).

cook <<<"$the_recipe"

При использовании других оболочек или если вы хотите указать, в какой директории находится временный файл, вам необходимо создать временный файл вручную. Большинство Unix предоставляют утилитуmktempдля безопасного создания временного файла. (Никогда не используйте что-то вроде… >/tmp/temp.$$! Это позволяет другим программам, даже работающим от имени других пользователей, перехватывать файл. )Вот сценарий, создающий временный файл и удаляющий его в случае прерывания.

tmp=
trap 'rm -f "$tmp"' EXIT
trap 'rm -f "$tmp"; trap "" HUP; kill -INT $$' HUP
trap 'rm -f "$tmp"; trap "" INT; kill -INT $$' INT
trap 'rm -f "$tmp"; trap "" TERM; kill -INT $$' TERM
tmp=$(mktemp)
printf '%s\n' "$the_recipe" >"$tmp"
cook "$tmp"

Чтобы выбрать место для создания временного файла, установите переменную среды TMPDIRдля вызова mktemp. Например, чтобы создать временный файл в текущем каталоге, а не в месте по умолчанию для временных файлов:

tmp=$(TMPDIR="$PWD" mktemp)

(Использование $PWDвместо .дает вам абсолютное имя файла, что означает, что вы можете безопасно вызывать cdв своем скрипте, не беспокоясь о том, что $tmpбольше не будет обозначать тот же файл.)

Если приложению требуется имя файла с определенным расширением, необходимо создать временный каталог и создать там файл. Чтобы создать временный каталог, используйте mktemp -d. Опять же, установите переменную среды TMPDIR, если вы хотите контролировать, где создается временный каталог.

tmp=
trap 'rm -rf "$tmp"' EXIT
trap 'rm -rf "$tmp"; trap "" HUP; kill -INT $$' HUP
trap 'rm -rf "$tmp"; trap "" INT; kill -INT $$' INT
trap 'rm -rf "$tmp"; trap "" TERM; kill -INT $$' TERM
tmp=$(mktemp -d)
printf '%s\n' "$the_recipe" >"$tmp/myfile.ext"
cook "$tmp/myfile.ext"

0
22.08.2018, 15:44
0 ответов

Теги

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