Проблема при следовании учебнику заключается в том, что не у всех есть одинаковое количество устройств или они могут быть настроены по-разному. Если вы пытаетесь настроить двойную загрузку с 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/
Чтобы точно ответить на ваш вопрос, вы можете:
cat mouse.jpg | { tf=$(mktemp); cat >"$tf"; echo "$tf"; } | xargs imageviewer
По крайней мере, в 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
, пока не будет прочитано имя файла из средней части конвейера. Имя файла не будет выводиться промежуточной командой до тех пор, пока не будет создан временный файл.
После уточнения 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