LinuxForum.Fans
Тема

Кто как надежно определяет путь к скрипту (bash, sh, dash) ?

Автор: smaharbA 18 сообщений 4884 просмотров
#350306

Дайте самый верный вариант для случаев

text

./скрипт
скрипт #когда есть в путях
source ./скрипт
source скрипт
/путь/скрипт
source /путь/скрипт
/путь/../../../../путь/скрипт
../../../../путь/скрипт
source /путь/../../../../путь/скрипт
source ../../../../путь/скрипт

и т.д. на сколько фантазии хватит

#351074

есть конечно вариант с обработкой ошибки без завершения скрипта, но может есть надежнее

#351155
text
$ cat /home/john/example.sh
#!/bin/bash
P=$( cd "$( dirname "$0" )" && pwd )
echo $P
$ bash /home/john/example.sh
/home/john
#351208

zenon

text
# cd /root
# . /home/john/example.sh
# /root

где ошибка ?

#351303
"smaharbA" написал:
где ошибка ?

Без понятия. УМВР:

text
[/] root@localhost # cat /home/john/example.sh
#!/bin/bash
P=$( cd "$( dirname "$0" )" && pwd )
echo $P
[~] root@localhost # chmod +x /home/john/example.sh
[~] root@localhost # /home/john/example.sh
/home/john
[~] root@localhost # cd /mnt
[/mnt] root@localhost # /home/john/example.sh
/home/john
[/mnt] root@localhost # cd /root
[~] root@localhost # /home/john/example.sh
/home/john
[/] root@localhost # mv /home/john/example.sh /usr/local/sbin
[/] root@localhost # /usr/local/sbin/example.sh
/usr/local/sbin
[/] root@localhost # cd /home
[/home] root@localhost # /usr/local/sbin/example.sh
/usr/local/sbin
#351329

тогда так

text
# cd /root
# source /home/john/example.sh
# /root

или так

text

dash -c ". /home/john/example.sh"
#351340

Не понял к чему тут этот фент - . /

text
[/var/log] root@localhost # source /usr/local/sbin/example.sh
/usr/local/sbin
[/var/log] root@localhost # cd /home/john 
[/home/john] root@localhost # source /usr/local/sbin/example.sh
/usr/local/sbin
[/home/john] root@localhost # dash -c "/usr/local/sbin/example.sh" 
/usr/local/sbin
[/home/john] root@localhost # dash /usr/local/sbin/example.sh   
/usr/local/sbin
[/home/john] root@localhost # dash -c ". /usr/local/sbin/example.sh"
/home/john
[/home/john] root@localhost # 
#351349

а Вы не привираете на строчках с source ?
см. последний вывод

#351352
"smaharbA" написал:
а Вы не привираете на строчках с source ?

Ни в коем разе:

text
[~] root@localhost # source /usr/local/sbin/example.sh
/usr/local/sbin
#351356

smaharbA, я понимаю, краткость - сестра таланта, но я не могу понять, что тут не так. Можете чуть подробнее?

#351359

Что выдаст такой код ?

text

#!/bin/bash
echo $0

когда вызовем его так

cd /var/log
source /home/john/example.sh

или так в dash/sh
cd /var/log
. /home/john/example.sh

#351364
"smaharbA" написал:
. /home/john/example.sh

Не понимаю смысл, ведь это заведомо ошибка:

text
# /usr/local/sbin/example.sh 
/usr/local/sbin
[~] root@localhost # ./usr/local/sbin/example.sh
zsh: Нет такого файла или каталога: ./usr/local/sbin/example.sh
[~] root@localhost # cd /usr/local/sbin/ 
[/usr/local/sbin] root@localhost # ./example.sh 
/usr/local/sbin
[/usr/local/sbin] root@localhost # bash
root@localhost:/usr/local/sbin# /usr/local/sbin/example.sh 
/usr/local/sbin

bash

text
# ./usr/local/sbin/example.sh 
bash: ./usr/local/sbin/example.sh: Нет такого файла или каталога
#351366

какая ошибка ?

пусть как в Вашем случае

/usr/local/sbin/example.sh

состоит всего из пары строк, пусть для баша (хотя в случае source не имеет значения)

text

#!/bin/bash
echo $0

запускаем так

cd /var/log
source /usr/local/sbin/example.sh

или так

cd /var/log
.[это пробел]/usr/local/sbin/example.sh

что у Вас выдает такой скрипт ?

#351369
text
# cat /usr/local/sbin/example.sh 
#!/bin/bash
echo $0
text
# . /usr/local/sbin/example.sh 
bash
# /usr/local/sbin/example.sh 
/usr/local/sbin/example.sh
#351380

Если bash/zsh, то:

text
echo ${BASH_SOURCE:-$0}
#351451

для bash,sh,dash

вариант как уже сказано, через обработку ошибки существует.

#351662

Решение то простое и оно на поверхности, но не факт, что будет всегда работать.

к слову про башсурс - это так то массив и что он вам выдаст зависит от вложенности.

#351885

Вариант стар как баш и даш, но всеж таки может кто удумает независимый

text
#!/usr/bin/env dash

bash -c "x=`{ echo \${BASH_SOURCE[0]}; } 2>&1 | cut -d: -f3`;echo \$0 \$x"

dash -c "x=`{ echo \${BASH_SOURCE[0]}; } 2>&1 | cut -d: -f3`;echo \$0 \$x"

zsh -c "x=`{ echo \${BASH_SOURCE[0]}; } 2>&1 | cut -d: -f3`;echo \$0 \$x"

ash -c "x=`{ echo \${BASH_SOURCE[0]}; } 2>&1 | cut -d: -f3`;echo \$0 \$x"

csh -c "set x=`{ echo \${BASH_SOURCE[0]}; } 2>&1 | cut -d: -f3`;echo \"\$shell \$x\""

x=`{ echo ${BASH_SOURCE[0]}; } 2>&1 | cut -d: -f3`;echo $0 $x

Войдите или зарегистрируйтесь, чтобы ответить.