Как узнать имя файла скрипта в скрипте Bash? - PullRequest
521 голосов
/ 10 октября 2008

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

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

Ответы [ 22 ]

8 голосов
/ 15 октября 2010

Re: ответ Tanktalus (принятый) выше, более чистый способ использования:

me=$(readlink --canonicalize --no-newline $0)

Если ваш скрипт был получен из другого скрипта bash, вы можете использовать:

me=$(readlink --canonicalize --no-newline $BASH_SOURCE)

Я согласен, что было бы непонятно, если вы хотите разыменовать символические ссылки, если ваша цель - предоставить обратную связь пользователю, но бывают случаи, когда вам нужно получить каноническое имя для сценария или другого файла, и это лучший способ ИМХО.

8 голосов
/ 25 января 2017

, если ваш скрипт запуска оболочки, например

/home/mike/runme.sh

$ 0 - полное имя

 /home/mike/runme.sh

basename $ 0 получит базовое имя файла

 runme.sh

и вам нужно поместить это базовое имя в переменную типа

filename=$(basename $0)

и добавьте дополнительный текст

echo "You are running $filename"

так что ваши скрипты вроде

/home/mike/runme.sh
#!/bin/bash 
filename=$(basename $0)
echo "You are running $filename"
7 голосов
/ 10 октября 2008

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

basename $0
5 голосов
/ 14 ноября 2012
this="$(dirname "$(realpath "$BASH_SOURCE")")"

Это разрешает символические ссылки (это делает realpath), обрабатывает пробелы (это делают двойные кавычки) и находит текущее имя скрипта, даже если он получен (. ./Myscript) или вызван другими скриптами ($ BASH_SOURCE обрабатывает это). После всего этого хорошо сохранить это в переменной среды для повторного использования или для простого копирования в другом месте (this =) ...

3 голосов
/ 19 января 2018

В bash вы можете получить имя файла скрипта, используя $0. Обычно $1, $2 и т. Д. Предназначены для доступа к аргументам CLI. Точно так же $0 - для доступа к имени, которое запускает скрипт (имя файла скрипта).

#!/bin/bash
echo "You are running $0"
...
...

Если вы вызываете скрипт с путем, подобным /path/to/script.sh, то $0 также выдаст имя файла с путем. В этом случае необходимо использовать $(basename $0), чтобы получить только имя файла скрипта.

2 голосов
/ 22 февраля 2015

Информация благодаря Биллу Эрнандесу. Я добавил некоторые настройки, которые я принимаю.

#!/bin/bash
function Usage(){
    echo " Usage: show_parameters [ arg1 ][ arg2 ]"
}
[[ ${#2} -eq 0 ]] && Usage || {
    echo
    echo "# arguments called with ---->  ${@}     "
    echo "# \$1 ----------------------->  $1       "
    echo "# \$2 ----------------------->  $2       "
    echo "# path to me --------------->  ${0}     " | sed "s/$USER/\$USER/g"
    echo "# parent path -------------->  ${0%/*}  " | sed "s/$USER/\$USER/g"
    echo "# my name ------------------>  ${0##*/} "
    echo
}

Приветствия

1 голос
/ 13 августа 2017
echo "$(basename "`test -L ${BASH_SOURCE[0]} \
                   && readlink ${BASH_SOURCE[0]} \
                   || echo ${BASH_SOURCE[0]}`")"
1 голос
/ 10 октября 2008

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

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

Как заставить ./linktoscript распечатать script.sh?

[EDIT] Согласно @ephemient в комментариях выше, хотя символическая ссылка может показаться надуманной, можно поиграть с $0 так, чтобы она не представляла ресурс файловой системы. ОП немного двусмысленно о том, что он хотел.

0 голосов
/ 16 апреля 2015

что-то подобное?

export LC_ALL=en_US.UTF-8
#!/bin/bash
#!/bin/sh

#----------------------------------------------------------------------
start_trash(){
ver="htrash.sh v0.0.4"
$TRASH_DIR  # url to trash $MY_USER
$TRASH_SIZE # Show Trash Folder Size

echo "Would you like to empty Trash  [y/n]?"
read ans
if [ $ans = y -o $ans = Y -o $ans = yes -o $ans = Yes -o $ans = YES ]
then
echo "'yes'"
cd $TRASH_DIR && $EMPTY_TRASH
fi
if [ $ans = n -o $ans = N -o $ans = no -o $ans = No -o $ans = NO ]
then
echo "'no'"
fi
 return $TRUE
} 
#-----------------------------------------------------------------------

start_help(){
echo "HELP COMMANDS-----------------------------"
echo "htest www                 open a homepage "
echo "htest trash               empty trash     "
 return $TRUE
} #end Help
#-----------------------------------------------#

homepage=""

return $TRUE
} #end cpdebtemp

# -Case start
# if no command line arg given
# set val to Unknown
if [ -z $1 ]
then
  val="*** Unknown  ***"
elif [ -n $1 ]
then
# otherwise make first arg as val
  val=$1
fi
# use case statement to make decision for rental
case $val in
   "trash") start_trash ;;
   "help") start_help ;;
   "www") firefox $homepage ;;
   *) echo "Sorry, I can not get a $val   for you!";;
esac
# Case stop
0 голосов
/ 10 октября 2008

echo "Вы запускаете $ 0"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...