Странное поведение в $ (dirname `readlink -f $ 0`)

11

Когда я запускаю следующее как обычный пользователь, все нормально:

$(dirname `readlink -f $0`)

но после того, как я переключился на root, произошла следующая ошибка:

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

Есть идеи? Я попробовал на локальной Fedora 16 и Amazon EC2, обе работают под управлением оболочки bash.

редактировать для иллюстрации.

извиняюсь, что я не проиллюстрировал эту проблему здесь. вот сценарий:

используя обычную учетную запись пользователя:

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

используя root:

# 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
источник

Ответы:

16

Это должно быть той же ошибкой, что и в пользовательской оболочке входа в систему, поскольку в оболочке входа в систему 0параметр оболочки, расширяющийся до имени текущего процесса, дает -bashминус, указывающий оболочку входа в систему. Теперь вы видите, откуда -bвозникла ошибка.

Попробуй вместо

echo "$( dirname "$(readlink -f -- "$0")" )"
enzotib
источник
Что означает --(«минус минус» или «тире»)? Неважно - я нашел ответ здесь: /unix//q/11376
osullic
3

Если вы действительно хотите имя каталога запускаемого сценария оболочки:

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

Да, это немного грязно, но это безопасно.

Если вам нужна текущая оболочка, вы можете попробовать @ MichaelMrozek предложить использовать $SHELL.

l0b0
источник