compose()
case $# in
[01]) "$@" ;; ## if 1 or fewer args just run what we've got
*) "$1" | { ## otherwise pipe output from $1 into a
shift; compose "$@" ## self-call until all args are gone
}; esac
Если вы запустите
(cd my_utility_version_dir && exec./my_util "$OLDPWD/my_data_file")
затем
my_util
текущий рабочий каталог(.
)будетmy_utility_version_dir
my_data_file
в предыдущем рабочем каталоге -, из которого вы cd
удалили. Ищет ли он его там или нет, зависит от того, как именно my_util
работает внутри, но довольно часто он принимает путь для использования.