Если ваша оболочка поддерживает встроенную переменную PPID
, вы можете использовать эту переменную, если вас действительно интересует PID процесса, вызвавшего оболочку.
Если вас интересует PID этой оболочки и вы хотите передавать его другим, используйте $$
.
Я думаю, есть ли разница или нет, зависит от конкретной версии Unix, которую вы используете. Например, в OSX readlink не имеет флага -f
и указывает:
If the given argument is not a symbolic link, readlink will print nothing and exit with an error
Если вы знаете, что ваша ОС поддерживает флаг -f
, то разницы быть не должно.
На самом деле флаг-m может быть наиболее гибким в использовании.
Вы должны использовать "$0"
и dirname "$()"
.
Команды не эквивалентны, поскольку проверка оболочки влияет только на последний компонент в пути, а readlink -f
влияет на все уровни пути.
mkdir physdir
touch physdir/file
ln -s physdir symlink
test -L symlink/file ; echo $?
1
test -L symlink ; echo $?
0
dirname symlink/file
symlink
dirname "$(readlink -f symlink/file)"
/crypto/home/hl/tmp/stackexchange/readlink/physdir
Таким образом, для относительных путей вывод сильно отличается, но даже для абсолютных путей каталоги символических ссылок внутри различаются.