Как узнать имя файла скрипта в скрипте Bash?

Как определить имя файла сценария Bash внутри самого сценария?

Например, если мой сценарий находится в файле runme.sh, то как мне сделать так, чтобы он отображал «Вы запускаете runme. sh "сообщение без жесткого кодирования это?

546
задан 29.04.2020, 21:39

9 ответов

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.

572
ответ дан 29.04.2020, 21:47
  • 1
    Dario, Википедия не соглашается, перечисляя девять языков, где все переменные являются однократным присвоением и еще пятью, где однократное присвоение является опцией: en.wikipedia.org/wiki/Single_assignment . Кроме того, математики, которые придумали термин, также используют переменные в смысле однократного присвоения. Если you' ре, собирающееся приводить доводы против этого, как насчет того, чтобы отправить подробный ответ, показывающий, почему это - неправильное представление? – Curt J. Sampson 14.06.2009, 20:09

С удар> = 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"
186
ответ дан 29.04.2020, 21:40
  • 1
    Проблема, мы должны закодировать наши СООБЩЕНИЯ, не наш ДОБИРАЕТСЯ. – Gregory Higley 03.10.2019, 11:00

Для ответа Chris Conway на Linux (по крайней мере), Вы сделали бы это:

echo $(basename $(readlink -nf [110]))

readlink распечатывает значение символьной ссылки. Если это не символьная ссылка, это печатает имя файла.-n говорит ему не печатать новую строку.-f говорит ему переходить по ссылке полностью (если бы символьная ссылка была ссылкой на другую ссылку, это разрешило бы что один также).

19
ответ дан 29.04.2020, 21:42
  • 1
    Спасибо @BradLarson 4 Обновления. I' m использующий эту категорию для сжатия зарегистрированное видео (Среднее Качество) на iPad, но мне don' t видят любое сокращение размера файла видео после использования этой категории. Это остается тем же, есть ли некоторая вещь I' hv, пропущенный? – Pranav Jaiswal 03.10.2019, 11:04

отзовитесь эхом "Вы выполняете 0$"

0
ответ дан 29.04.2020, 21:43

Можно использовать 0$ для определения названия сценария (с полным путем) - для получения названия сценария только можно обрезать ту переменную с

basename [110]
7
ответ дан 29.04.2020, 21:45
  • 1
    We' ре, не взволнованное по поводу сжатия, прибывающего из сервера. We' ре, взволнованное по поводу сжатия, идущего В сервер. I' ve отредактировал мой вопрос отразить это. – Gregory Higley 03.10.2019, 11:04

Если название сценария имеет пробелы в нем, более устойчивый путь состоит в том, чтобы использовать "[110]" или "$(basename "[111]")" - или на MacOS: "$(basename \"[112]\")". Это препятствует имени то, чтобы быть искаженным или интерпретируемый всегда. В целом это - хорошая практика к всегда именам переменной двойной кавычки в оболочке.

64
ответ дан 29.04.2020, 21:45

[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 немного неоднозначен о том, что он хотел.

1
ответ дан 29.04.2020, 21:50

Эти ответы корректны для спорных вопросов, которые они формулируют, но существует тихое проблема при выполнении сценария из другого сценария с помощью 'исходного' ключевого слова (так, чтобы это работало в той же оболочке). В этом случае Вы получаете 0$ сценария выполнения вызова. И в этом случае, я не думаю, что возможно получить название самого сценария.

Это - пограничный случай и не должно быть отнесено СЛИШКОМ серьезно. При выполнении сценария из другого сценария непосредственно (без 'источника') использование 0$ будет работать.

12
ответ дан 29.04.2020, 21:52
  • 1
    @Brad ссылка категории Larson NSData не работает (404 не найденный). Обновите... – Pranav Jaiswal 03.10.2019, 11:05
  • 2
    У Вас есть очень положительная сторона. Не пограничный случай IMO. Существует решение хотя: См. Dimitre Radoulov' s отвечают выше – Serge Wautier 29.04.2020, 21:53

Если бы Вы хотите его без пути тогда, Вы использовали бы ${0##*/}

24
ответ дан 29.04.2020, 21:53
  • 1
    @Pranav - Видео H.264 уже в большой степени сжато. Сжатие Gzip isn' t собирающийся делать много для этого. Работы Gzip лучше всего для несжатых источников как текст, и могут даже make-файлы, больше, если используется на уже сжатых файлах. – Brad Larson♦ 03.10.2019, 11:04

Теги

Похожие вопросы