Как получить путь к Bash-скрипту, если он выполняется через символическую ссылку?

Одним из подходов может быть установка инструмента GNU timeoutчерезbrew:

$ brew install coreutils

Вы можете видеть, что timeoutявляется частью этого пакета:

$ brew list coreutils | grep timeout
/usr/local/Cellar/coreutils/8.29/bin/gtimeout
/usr/local/Cellar/coreutils/8.29/libexec/gnubin/timeout
/usr/local/Cellar/coreutils/8.29/libexec/gnuman/man1/timeout.1
/usr/local/Cellar/coreutils/8.29/share/man/man1/gtimeout.1

А потом сделай так:

$ gtimeout 3 networksetup....

Пример

Здесь я делаю еще пару вещей. Я использую time, чтобы показать, что команда завершилась всего через 3 секунды, я защищаю команду с помощью -k5, который отправит SIGTERMкоманде, если она пройдет более 5 секунд.

$ time gtimeout -k5 3 sleep 10

real    0m3.005s
user    0m0.002s
sys 0m0.003s
0
31.07.2020, 18:57
1 ответ

realpathили readlink -fиз GNU coreutils могут помочь:

$ ls -l foo.sh bar.sh whereami.sh
lrwxrwxrwx 1 ilkkachu ilkkachu  6 Jul 31 19:01 bar.sh -> foo.sh*
lrwxrwxrwx 1 ilkkachu ilkkachu 11 Jul 31 19:01 foo.sh -> whereami.sh*
-rwxr-xr-x 1 ilkkachu ilkkachu 36 Jul 31 19:02 whereami.sh*
$ cat whereami.sh
#!/bin/bash
echo "$BASH_SOURCE"
realpath "$BASH_SOURCE"
$./bar.sh
./bar.sh
/tmp/whereami.sh
4
18.03.2021, 23:16

Теги

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