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

this полезен в шаблоне построителя.

public class User {

    private String firstName;
    private String surname;

    public User(Builder builder){
        firstName = builder.firstName;
        surname = builder.surname;
    }

    public String getFirstName(){
        return firstName;
    }

    public String getSurname(){
        return surname;
    }

    public static class Builder {
        private String firstName;
        private String surname;

        public Builder setFirstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder setSurname(String surname) {
            this.surname = surname;
            return this;
        }

        public User build(){
            return new User(this);
        }

    }

    public static void main(String[] args) {
        User.Builder builder = new User.Builder();
        User user = builder.setFirstName("John").setSurname("Doe").build();
    }

}
529
задан Peter Mortensen 21 December 2013 в 23:57
поделиться

11 ответов

me=`basename "$0"`

Для прочтения symlink1, который обычно является не, что Вы хотите (Вы обычно не хотите смущать пользователя этот путь), попробуйте:

me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"

IMO, это произведет запутывающий вывод. "Я выполнил foo.sh, но он говорит, что я выполняю bar.sh!? Должна быть ошибка!" Кроме того, одна из целей того, что по-другому назвала символьные ссылки состоит в том, чтобы обеспечить другую функциональность на основе имени, которым это называют как (думайте gzip и gunzip на некоторых платформах).


1 таким образом, для разрешения символьных ссылок, таким образом это, когда пользователь выполняется foo.sh который является на самом деле символьной ссылкой на bar.sh, Вы хотите использовать разрешенное имя bar.sh вместо foo.sh.

588
ответ дан BeeOnRope 21 December 2013 в 23:57
поделиться
  • 1
    Dario, Википедия не соглашается, перечисляя девять языков, где все переменные являются однократным присвоением и еще пятью, где однократное присвоение является опцией: en.wikipedia.org/wiki/Single_assignment . Кроме того, математики, которые придумали термин, также используют переменные в смысле однократного присвоения. Если you' ре, собирающееся приводить доводы против этого, как насчет того, чтобы отправить подробный ответ, показывающий, почему это - неправильное представление? – Curt J. Sampson 14 June 2009 в 17:09

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

0
ответ дан mmacaulay 21 December 2013 в 23:57
поделиться

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

basename $0
7
ответ дан VolkA 21 December 2013 в 23:57
поделиться
  • 1
    We' ре, не взволнованное по поводу сжатия, прибывающего из сервера. We' ре, взволнованное по поводу сжатия, идущего В сервер. I' ve отредактировал мой вопрос отразить это. – Gregory Higley 23 October 2008 в 20:43

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

echo $(basename $(readlink -nf $0))

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

19
ответ дан Community 21 December 2013 в 23:57
поделиться

$0 не отвечает на вопрос (насколько я понимаю). Демонстрация:

$ cat script.sh
#! /bin/sh
echo `basename $0`
$ ./script.sh 
script.sh
$ ln script.sh linktoscript
$ ./linktoscript 
linktoscript

Как каждый добирается ./linktoscript распечатать script.sh?

[РЕДАКТИРОВАНИЕ] На @ephemient в комментариях выше, хотя вещь символьной ссылки может казаться изобретенной, возможно играть с $0 таким образом, что это не представляет ресурс файловой системы. OP немного неоднозначен о том, что он хотел.

1
ответ дан Chris Conway 21 December 2013 в 23:57
поделиться

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

24
ответ дан Mr. Muskrat 21 December 2013 в 23:57
поделиться

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

66
ответ дан Andrew Faulkner 21 December 2013 в 23:57
поделиться

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

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

12
ответ дан Jim Dodd 22 December 2013 в 10:57
поделиться
  • 1
    @Brad ссылка категории Larson NSData не работает (404 не найденный). Обновите... – Pranav Jaiswal 14 July 2013 в 09:29

С ударом> = 3 следующие работы:

$ ./s
0 is: ./s
BASH_SOURCE is: ./s
$ . ./s
0 is: bash
BASH_SOURCE is: ./s

$ cat s
#!/bin/bash

printf '$0 is: %s\n$BASH_SOURCE is: %s\n' "$0" "$BASH_SOURCE"
186
ответ дан user 22 December 2013 в 10:57
поделиться
  • 1
    Проблема, мы должны закодировать наши СООБЩЕНИЯ, не наш ДОБИРАЕТСЯ. – Gregory Higley 23 October 2008 в 20:34

Короткий, ясный и простой, в my_script.sh

#!/bin/bash

running_file_name=$(basename "[110]")

echo "You are running '$running_file_name' file."

помещенный:

./my_script.sh
You are running 'my_script.sh' file.
0
ответ дан 22 November 2019 в 22:11
поделиться
# ------------- SCRIPT ------------- #

#!/bin/bash

echo
echo "# arguments called with ---->  ${@}     "
echo "# \$1 ---------------------->  $1       "
echo "# \$2 ---------------------->  $2       "
echo "# path to me --------------->  ${0}     "
echo "# parent path -------------->  ${0%/*}  "
echo "# my name ------------------>  ${0##*/} "
echo
exit

# ------------- CALLED ------------- #

# Notice on the next line, the first argument is called within double, 
# and single quotes, since it contains two words

$  /misc/shell_scripts/check_root/show_parms.sh "'hello there'" "'william'"

# ------------- RESULTS ------------- #

# arguments called with --->  'hello there' 'william'
# $1 ---------------------->  'hello there'
# $2 ---------------------->  'william'
# path to me -------------->  /misc/shell_scripts/check_root/show_parms.sh
# parent path ------------->  /misc/shell_scripts/check_root
# my name ----------------->  show_parms.sh

# ------------- END ------------- #
230
ответ дан 22 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

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