Вот подход, который я считаю, это чуть менее грязно, чем ответ Gilles (Хотя я уступаю, чтобы быть субъективным суждением).
#!/bin/sh this_dir=$(dirname "$0") # Alternatively, hard-code this as this_dir=$HOME/bin redacted_PATH=$(echo ":${PATH}:" | sed -e "s:\:$this_dir\::\::" -e "s/^://" -e 's/:$//') if obscured_prog=$(PATH=$redacted_PATH which foo) then ⋮ # Munging to do before running /usr/bin/foo "$(obscured_prog)" argument(s) # may be "$@", but might not be. ⋮ # Munging to do after running /usr/bin/foo else echo "$0: foo (real) not found in PATH." ⋮ # Any code that you want to do anyway. fi
Эта конструкция Redacted_Path
Быть $ Путь
Минус $ HOME / BIN
каталог, где эта частная копия Foo
жизни.
ECHO ": $ {путь}:"
добавляет двоеточия до начала и конца $ PATH
,
Таким образом, каждый компонент этого будет предшествовать и сопровождается толстой кишкой -
Даже первый и последний. SED
SED ищет
: $this_dir :
(с пробелами, добавленными для «ясности») и заменяет его с помощью
:
, т. Е. ЭТОТ $ thiss_dir
из »: $ {путь }: «
.
Затем он удаляет двоеточия с самого начала и конца.
Тогда мы временно устанавливаем Путь
на $ Redacted_Path
И искать foo
, используя , который
.
Если успешно, мы получаем полный путь к нему (например, / bin / foo
или / usr / bin / foo
),
Что мы используем для запуска реальной (публичной / общей / системной) копии FOO
.
Так как мы изменили Путь
только временно,
/ bin / foo
имеет доступ к Ambient пользователя $ PATH
,
И так, если / bin / foo
работает BRILLIG
, он может найти $ HOME / BIN / BRILLIG
(если он существует).
У этого возникнет проблема, если $ HOME / BIN
появляется в $ PATH
несколько раз,
Но это не слишком сложно, чтобы исправить.
С текущей версией xfce-терминала (4.12) это невозможно, так как для терминальной эмуляции используется старинный, основанный на Gtk+2 байт. Следует подождать, пока они перенесут свой код на новую, основанную на Gtk+3 vte, или переключиться на другой терминальный эмулятор (например, gnome-terminal).