GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya tahu nama file skrip dalam skrip Bash?

Dengan bash>=3 berikut berfungsi:

$ ./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"

# ------------- 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 ------------- #

$BASH_SOURCE memberikan jawaban yang benar saat mengambil skrip.

Namun ini termasuk jalur sehingga untuk mendapatkan nama file skrip saja, gunakan:

$(basename $BASH_SOURCE) 

me=`basename "$0"`

Untuk membaca melalui symlink, yang biasanya bukan yang Anda inginkan (biasanya Anda tidak ingin membingungkan pengguna dengan cara ini), cobalah:

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

IMO, itu akan menghasilkan keluaran yang membingungkan. "Aku menjalankan foo.sh, tapi katanya aku menjalankan bar.sh!? Pasti bug!" Selain itu, salah satu tujuan memiliki symlink dengan nama berbeda adalah untuk menyediakan fungsionalitas berbeda berdasarkan nama namanya (pikirkan gzip dan gunzip pada beberapa platform).

Yaitu, untuk menyelesaikan symlink sedemikian rupa sehingga ketika pengguna mengeksekusi foo.sh yang sebenarnya merupakan symlink ke bar.sh , Anda ingin menggunakan nama yang diselesaikan bar.sh bukan foo.sh .


Linux
  1. Mengapa Skrip Bash Tidak Mengenal Alias?

  2. Bagaimana Cara Men-debug Skrip Bash?

  3. Bagaimana Menghentikan Skrip Loop Bash Di Terminal?

  1. Bagaimana Cara Membaca Seluruh Script Shell Sebelum Mengeksekusinya?

  2. Bagaimana Cara Membuat Script Bash Untuk Mengubah Format Tanggal Dalam File Csv?

  3. Cara memasukkan file dalam skrip bash shell

  1. Basa'?

  2. Bagaimana cara mendapatkan direktori absolut dari sebuah file di bash?

  3. Cara grep untuk unicode � dalam skrip bash