Примечание к общему решению: многим программам, которым требуется имя файла, вы можете указать путь / dev / stdout
(ссылка на / proc / self / fd / 1
(при условии, что указанные файлы существуют), и они с радостью отправят свой вывод на stdout
. Также можно использовать замену процесса в bash
с помощью cat
, т.е. foo -f> (cat) args | bar
(спасибо, g-man ).
Поскольку pico2wave
проверяет расширение файла, возможным решением является символическая ссылка / dev / stdout
на путь с соответствующим расширением, в идеале где-нибудь, например / var / местный /
. Это создает дополнительный файл, но не для каждого процесса:
ln -s / dev / stdout /var/local/pico2wave.wav
, затем pico2wave -w / var / local /pico2wave.wav "тест" | aplay
работает.
Вы можете узнать, в каком каталоге находится скрипт ( $ 0: h
в zsh, «$ {0% / *}»
в sh) и удалите этот каталог из ПУТЬ
( path = ($ {path: # $ 0: h})
в zsh, более сложный в sh . Это может потерпеть неудачу, если ПУТЬ
содержит один и тот же каталог дважды, например, через символическую ссылку.
Обратной стороной прямого подхода является то, что он удаляет каталог из пути, но другие программы в том же каталоге могут Вы можете решить эту проблему, выполнив поиск только пути с измененным путем.
next=$(path=(${path:#$0:h}); print -lr -- =$0:t)
$next
Вместо этого я бы выполнил поиск PATH
вручную и пропустил любое вхождение запущенного сценария.
for d in $path; do
if [[ -x $d/$0:t && ! $d/$0:t -ef $0 ]]; then
exec $d/$0:t
fi
done
Пример:
Для меня type -a egrep
печатает определенный пользователем псевдоним и фактическое egrep
, добавление еще одного egrep
в мой $ HOME / bin / тоже показывает его ... В порядке; сначала псевдоним, затем остальные элементы в том же порядке, в котором они находятся в PATH.
$ cd # go home $ mkdir -p bin $ PATH=$HOME/bin:$PATH $ type -a egrep egrep is aliased to `egrep --color=auto' egrep is /bin/egrep $ echo -e >bin/egrep '#!/bin/bash\necho TEST' $ chmod 755 bin/egrep $ type -a egrep egrep is aliased to `egrep --color=auto' egrep is /home/$USER/bin/egrep egrep is /bin/egrep # assuming you're sure it is the only one not in /home and not an alias $ type -a egrep | grep -Ev '/home|alias' | cut -d' ' -f3 /bin/egrep $ rm $HOME/bin/egrep