Dziwne zachowanie w $ (nazwa katalogu `readlink -f $ 0`)

11

Gdy uruchamiam następujące funkcje jako zwykły użytkownik, wszystko jest w porządku:

$(dirname `readlink -f $0`)

ale po przejściu na root wystąpił następujący błąd:

readlink: invalid option -- 'b'
Try `readlink --help' for more information.
dirname: missing operand
Try `dirname --help' for more information.

Jakieś pomysły? Próbowałem na lokalnej Fedorze 16 i Amazon EC2, oba działające w powłoce bash.

edytuj dla ilustracji.

przepraszam, że nie zilustrowałem tutaj problemu. oto scenariusz:

używając zwykłego konta użytkownika:

$ pwd 
/home/myuser 
$ export MY_DIR=$(dirname `readlink -f $0`) 
$ echo MY_DIR 
/home/myuser

za pomocą roota:

# pwd
/root
# export ROOT_DIR=$(dirname `readlink -f $0`)
readlink: invalid option -- 'b'
Try `readlink --help' for more information.
dirname: missing operand
Try `dirname --help' for more information.

# export ROOT_DIR=echo $(dirname `readlink -f -- $0`)
# echo $ROOT_DIR
/root
d4v1dv00
źródło

Odpowiedzi:

16

Powinien to być ten sam błąd, co w powłoce logowania użytkownika, ponieważ w powłoce logowania 0parametr powłoki, rozwijając się do nazwy bieżącego procesu, daje -bashminus wskazujący powłokę logowania. Teraz widzisz, skąd -bpochodzi błąd.

Spróbuj zamiast tego

echo "$( dirname "$(readlink -f -- "$0")" )"
enzotib
źródło
Co --oznaczają („minus minus” lub „myślnik”)? Nevermind - znalazłem odpowiedź tutaj: /unix//q/11376
osullic
3

Jeśli naprawdę chcesz nazwę katalogu uruchamianego skryptu powłoki:

script_dir="$(dirname -- "$(readlink -f -- "$0")")"

Tak, jest trochę za ciasno, ale jest bezpiecznie.

Jeśli chcesz mieć bieżącą powłokę, możesz wypróbować sugestię @ MichaelMrozek dotyczącą użycia $SHELL.

l0b0
źródło