Дивна поведінка в $ (dirname `readlink -f $ 0`)


11

Коли я запускаю таке, як звичайний користувач, все добре:

$(dirname `readlink -f $0`)

але після переходу на корінь сталася така помилка:

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

Будь-які ідеї? Я спробував на локальних Fedora 16 та Amazon EC2, обидва працює bash shell.

редагувати для ілюстрації

Вибачте, що я далі не проілюстрував це питання. ось сценарій:

використовуючи звичайний обліковий запис користувача:

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

за допомогою кореня:

# 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

Відповіді:


16

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

Спробуйте замість цього

echo "$( dirname "$(readlink -f -- "$0")" )"

Що вказує на --("мінус мінус" або "тире")? Nevermind - відповідь я знайшов тут: /unix//q/11376
осулик

3

Якщо ви дійсно хочете, щоб ім'я каталогу сценарію оболонки, який запускається:

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

Так, це трохи незграбно, але це безпечно.

Якщо ви хочете поточну оболонку, ви можете спробувати пропозицію @ MichaelMrozek використовувати $SHELL.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.