Как определить имя файла сценария Bash внутри самого сценария?
Например, если мой сценарий находится в файле runme.sh
, то как мне сделать так, чтобы он отображал «Вы запускаете runme. sh "сообщение без жесткого кодирования это?
me=`basename "[110]"`
Для прочтения символьной ссылки <глоток> 1 глоток>, который обычно является не, что Вы хотите (Вы обычно не хотите смущать пользователя этот путь), попробуйте:
me="$(basename "$(test -L "[111]" && readlink "[111]" || echo "[111]")")"
IMO, это произведет запутывающий вывод. "Я выполнил foo.sh, но он говорит, что я выполняю bar.sh!? Должна быть ошибка!" Кроме того, одна из целей того, что по-другому назвала символьные ссылки состоит в том, чтобы обеспечить различную функциональность на основе имени, которым это называют как (думайте gzip и gunzip на некоторых платформах).
<час> <глоток> 1 глоток> таким образом, для разрешения символьных ссылок, таким образом, что, когда пользователь выполняется foo.sh
, который является на самом деле символьной ссылкой на bar.sh
, Вы хотите использовать разрешенное имя bar.sh
, а не foo.sh
.
С удар> = 3 следующие работы:
$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s
$ cat s
#!/bin/bash
printf '[110] is: %s\n$BASH_SOURCE is: %s\n' "[110]" "$BASH_SOURCE"
Для ответа Chris Conway на Linux (по крайней мере), Вы сделали бы это:
echo $(basename $(readlink -nf [110]))
readlink распечатывает значение символьной ссылки. Если это не символьная ссылка, это печатает имя файла.-n говорит ему не печатать новую строку.-f говорит ему переходить по ссылке полностью (если бы символьная ссылка была ссылкой на другую ссылку, это разрешило бы что один также).
Можно использовать 0$ для определения названия сценария (с полным путем) - для получения названия сценария только можно обрезать ту переменную с
basename [110]
Если название сценария имеет пробелы в нем, более устойчивый путь состоит в том, чтобы использовать "[110]"
или "$(basename "[111]")"
- или на MacOS: "$(basename \"[112]\")"
. Это препятствует имени то, чтобы быть искаженным или интерпретируемый всегда. В целом это - хорошая практика к всегда именам переменной двойной кавычки в оболочке.
[111]
не отвечает на вопрос (насколько я понимаю). Демонстрация:
$ cat script.sh #! /bin/sh echo `basename [110]` $ ./script.sh script.sh $ ln script.sh linktoscript $ ./linktoscript linktoscript
, Как каждый заставляет ./linktoscript
распечатывать script.sh
?
[РЕДАКТИРОВАНИЕ] На @ephemient в комментариях выше, хотя вещь символьной ссылки может казаться изобретенной, возможно играть с [114]
таким образом, что это не представляет ресурс файловой системы. OP немного неоднозначен о том, что он хотел.
Эти ответы корректны для спорных вопросов, которые они формулируют, но существует тихое проблема при выполнении сценария из другого сценария с помощью 'исходного' ключевого слова (так, чтобы это работало в той же оболочке). В этом случае Вы получаете 0$ сценария выполнения вызова. И в этом случае, я не думаю, что возможно получить название самого сценария.
Это - пограничный случай и не должно быть отнесено СЛИШКОМ серьезно. При выполнении сценария из другого сценария непосредственно (без 'источника') использование 0$ будет работать.
Если бы Вы хотите его без пути тогда, Вы использовали бы ${0##*/}