GNU/Linux >> Belajar Linux >  >> Linux

Penerjemah Shell mana yang Menjalankan Skrip Tanpa Shebang?

Misalkan shell default untuk akun saya adalah zsh tetapi saya membuka terminal dan menjalankan bash dan menjalankan skrip bernama prac002.sh , penerjemah shell mana yang akan digunakan untuk mengeksekusi skrip, zsh atau bash? Perhatikan contoh berikut:

[email protected] ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf
[sudo] password for papagolf: 
papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh
# papagolf's default shell is zsh

[email protected] ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.)

[email protected]:~/My Files/My Programs/Learning/Shell$ ./prac002.sh 
Enter username : Rex
Rex
# Which interpreter did it just use?

**EDIT :** Ini isi scriptnya

[email protected] ~/My Files/My Programs/Learning/Shell % cat ./prac002.sh 
read -p "Enter username : " uname
echo $uname

Jawaban yang Diterima:

Karena skrip tidak dimulai dengan #! garis shebang menunjukkan penerjemah mana yang akan digunakan, POSIX mengatakan bahwa:

Jika execl() fungsi gagal karena kesalahan yang setara dengan kesalahan [ENOEXEC] yang ditentukan dalam volume Antarmuka Sistem POSIX.1-2008, shell akan menjalankan perintah yang setara dengan meminta shell dipanggil dengan nama path yang dihasilkan dari pencarian sebagai operan pertama , dengan argumen yang tersisa diteruskan ke shell baru, kecuali bahwa nilai "$0" di shell baru dapat disetel ke nama perintah. Jika file yang dapat dieksekusi bukan file teks, shell dapat melewati eksekusi perintah ini. Dalam hal ini, ia akan menulis pesan kesalahan, dan akan mengembalikan status keluar 126.

Ungkapan itu sedikit ambigu, dan cangkang yang berbeda memiliki interpretasi yang berbeda.

Dalam hal ini, Bash akan menjalankan skrip menggunakan dirinya sendiri . Sebaliknya, jika Anda menjalankannya dari zsh, zsh akan menggunakan sh (apa pun yang ada di sistem Anda) sebagai gantinya.

Anda dapat memverifikasi perilaku tersebut untuk kasus ini dengan menambahkan baris berikut ke skrip:

echo $BASH_VERSION
echo $ZSH_VERSION

Anda akan melihat bahwa, dari Bash, baris pertama menampilkan versi Anda, sedangkan baris kedua tidak pernah mengatakan apa pun, apa pun shell yang Anda gunakan.

  • Jika /bin/sh your Anda adalah, katakanlah, dash , maka tidak ada baris yang akan menampilkan apa pun saat skrip dijalankan dari zsh atau tanda hubung.
  • Jika /bin/sh your Anda adalah tautan ke Bash, Anda akan melihat keluaran baris pertama dalam semua kasus.
  • Jika /bin/sh adalah versi yang berbeda Bash daripada yang Anda gunakan secara langsung, Anda akan melihat keluaran yang berbeda saat menjalankan skrip dari bash secara langsung dan dari zsh.
Terkait:Perulangan melalui file dengan spasi di nama??

ps -p $$ perintah dari jawaban rools juga akan menampilkan informasi berguna tentang perintah yang digunakan shell untuk mengeksekusi skrip.


Linux
  1. Skrip Bash:juru bahasa yang buruk

  2. Apakah mungkin membuat skrip bash shell berinteraksi dengan program baris perintah lain?

  3. Cara memasukkan file dalam skrip bash shell

  1. Direktori perubahan skrip Shell dengan variabel

  2. Cara membunuh skrip python dengan skrip bash

  3. Membuat template dengan Linux dalam Shell Script?

  1. Tidak Dapat Menghentikan Skrip Bash Dengan Ctrl+c?

  2. Ubah direktori kerja di shell dengan skrip python

  3. nama dasar dengan spasi dalam skrip bash?