Создание временного файла из стандартного ввода

Проблема при следовании учебнику заключается в том, что не у всех есть одинаковое количество устройств или они могут быть настроены по-разному. Если вы пытаетесь настроить двойную загрузку с Win7/8, вы выберете устройство установки Kali с обозначением UEFI/EFI. Вам придется пройти через ручную настройку, чтобы выбрать неразделенное пространство (которое вы должны были настроить перед началом работы) для установки Kali. Поскольку вы новичок в Linux, возможно, вы захотите работать со всеми файлами в одном разделе (вы увидите обозначение, рекомендованное для новых пользователей). После установки вам нужно будет войти в CLI Kali и обновить Grub (загрузчик Linux), чтобы вы могли видеть как Win7/8, так и Kali.

Вот хороший учебник для вас: http://linuxbsdos.com/2015/01/14/how-to-dual-boot-kali-linux-1-0-9-and-windows-78-on-a-pc-with-uefi-firmware/

0
22.01.2019, 16:13
3 ответа

Чтобы точно ответить на ваш вопрос, вы можете:

cat mouse.jpg | { tf=$(mktemp); cat >"$tf"; echo "$tf"; } | xargs imageviewer
1
28.01.2020, 02:13

По крайней мере, в bashс использованием подстановки процесса:

utility <( some_other_utility )

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


Ваш пример:

cat mouse.jpg | submagic | xargs imageviewer

Я предполагаю, что это предназначено для отправки имени файлаmouse.jpgв imageviewer, так как нет смысла отправлять содержимое файла JPEG через xargs.

Этого можно добиться всего лишь

echo 'mouse.jpg' | xargs imageviewer

или

xargs imageviewer <<<'mouse.jpg'

в bash.

Отправку содержимого mouse.jpgна imageviewerможно выполнить с помощью

.
cat mouse.jpg | imageviewer /dev/stdin

или, используя замену процесса, с помощью

imageviewer <( cat mouse.jpg )

Использование временного файла:

tmpfile=$(mktemp)
cat mouse.jpg >"$tmpfile"

imageviewer "$tmpfile"

rm "$tmpfile"

Возможно,

tmpfile=$(mktemp)
cat mouse.jpg | { cat >"$tmpfile"; echo "$tmpfile"; } | xargs imageviewer
rm "$tmpfile"

Этот конвейер основан на том факте, что xargsбудет ждать с выполнением imageviewer, пока не будет прочитано имя файла из средней части конвейера. Имя файла не будет выводиться промежуточной командой до тех пор, пока не будет создан временный файл.

7
28.01.2020, 02:13

После уточнения submagicв вопросе я отредактировал ответ.

В zshвы можете создать временный файл из вывода команды с помощью =(... ). В отличие от <(... ), который может использовать файл устройства, такой как /dev/fd..., или именованный канал, форма =(... )создает доступный для поиска временный файл. См.http://zsh.sourceforge.net/Doc/Release/Expansion.html#Process-Substitution

Предполагая, что cat mouse.jpgявляется только примером для любой команды, которая отправляет данные изображения на стандартный вывод, вы можете использовать

imageviewer =(cat mouse.jpg)

Если вам нужно, чтобы временный файл, созданный zsh, имел определенное расширение, вы можете установить специальную переменнуюTMPSUFFIX):

(TMPSUFFIX=.jpg; imageviewer =(cat mouse.jpg))

второе обновление

Если вы настаиваете на синтаксисе

cat mouse.jpg | submagic | xargs imageviewer

можно было бы создать сценарий submagic, аналогичный командам, уже предложенным в ответе Кусалананды.

#! /bin/sh

# A fixed name allows multiple runs without creating lots of files and
# allows a simple script to remove the file afterwards.
TMPFILE=/tmp/submagic.tmp.jpg
rm -f "$TMPFILE" && cat > "$TMPFILE" && echo "$TMPFILE"

В отличие от механизмов оболочки, таких как =( cat mouse.jpg ), это не приведет к удалению $TMPFILEпосле запуска imageviewer.

Если вы можете запустить второй скрипт после запуска imageviewer, это может удалить файл, если он знает имя.

Скриптsubmagic-cleanup

#! /bin/sh

# A fixed name allows a simple script for cleaning up.
TMPFILE=/tmp/submagic.tmp.jpg
rm -f "$TMPFILE"

Тогда можно было бежать

cat mouse.jpg | submagic | xargs imageviewer
submagic-cleanup
3
28.01.2020, 02:13

Теги

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