исполняемая оболочка, запускать исходный исполняемый файл из хвоста PATH

Примечание к общему решению: многим программам, которым требуется имя файла, вы можете указать путь / 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 работает.

2
27.03.2016, 00:38
2 ответа

Вы можете узнать, в каком каталоге находится скрипт ( $ 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
2
27.01.2020, 22:04

Пример:
Для меня 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
1
27.01.2020, 22:04

Теги

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