Comportement étrange dans $ (dirname `readlink -f $ 0`)

11

Lorsque j'exécute ce qui suit en tant qu'utilisateur normal, tout va bien:

$(dirname `readlink -f $0`)

mais après avoir basculé en root, l'erreur suivante s'est produite:

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

Des idées? J'ai essayé sur Fedora 16 local et Amazon EC2, tous deux exécutant le shell bash.

modifier pour l'illustration.

excusez-moi de ne pas avoir illustré davantage le problème ici. voici le scénario:

en utilisant un compte utilisateur normal:

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

en utilisant 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
la source

Réponses:

16

Cela devrait être la même erreur que dans un shell de connexion utilisateur, car dans un shell de connexion, le 0paramètre de shell, qui se développe jusqu'au nom du processus en cours, donne -bash, le moins indiquant le shell de connexion. Vous voyez maintenant d'où -bvient l' erreur.

Essayez plutôt

echo "$( dirname "$(readlink -f -- "$0")" )"
enzotib
la source
Qu'est-ce que le --("moins moins" ou "tiret") indique?
Peu importe
3

Si vous voulez vraiment le nom du répertoire du script shell en cours d'exécution:

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

Oui, c'est un peu maladroit, mais c'est sûr.

Si vous voulez le shell actuel, vous pouvez essayer la suggestion de @ MichaelMrozek d'utiliser $SHELL.

l0b0
la source