GNU/Linux >> Belajar Linux >  >> Linux

Bash -c Dengan Parameter Posisi?

Biasanya, $0 dalam skrip diatur ke nama skrip, atau apa pun yang dipanggil (termasuk jalurnya). Namun, jika saya menggunakan bash dengan -c pilihan, $0 diatur ke argumen pertama yang diteruskan setelah string perintah:

bash -c 'echo $0' foo bar 
# foo 

Akibatnya, sepertinya parameter posisi telah digeser, tetapi termasuk $0 . Namun shift dalam string perintah tidak mempengaruhi $0 (seperti biasa):

bash -c 'echo $0; shift; echo $0' foo bar
# foo
# foo

Mengapa perilaku yang tampaknya aneh untuk string perintah ini?
Perhatikan bahwa saya mencari alasan, alasan, di balik penerapan perilaku aneh tersebut.

Orang dapat berspekulasi bahwa string perintah seperti itu tidak memerlukan $0 parameter seperti yang biasanya didefinisikan, jadi untuk ekonomi itu juga digunakan untuk argumen normal. Namun, dalam hal ini perilaku shift aneh. Kemungkinan lain adalah $0 digunakan untuk mendefinisikan perilaku program (ala bash disebut sebagai sh atau vim disebut sebagai vi ), tapi itu tidak mungkin, karena $0 di sini hanya terlihat di string perintah dan bukan oleh program yang dipanggil di dalamnya. Saya tidak bisa memikirkan kegunaan lain untuk $0 , jadi saya bingung menjelaskannya.

Jawaban yang Diterima:

Itu memberi Anda kesempatan untuk mengatur/memilih $0 saat menggunakan skrip sebaris. Jika tidak, $0 hanya akan menjadi bash .

Kemudian Anda dapat melakukan misalnya:

$ echo foo > foo
$ bash -c 'wc -c < "${1?}"' getlength foo
4
$ rm -f bar
$ bash -c 'wc -c < "${1?}"' getlength bar
getlength: bar: No such file or directory
$ bash -c 'wc -c < "${1?}"' getlength
getlength: 1: parameter not set

Tidak semua kerang biasa melakukan itu. Shell Bourne melakukannya. Shell Korn (dan Almquist) memilih agar parameter pertama masuk ke $1 sebagai gantinya. POSIX akhirnya menggunakan cara Bourne, jadi ksh dan ash turunan dikembalikan ke itu nanti (lebih lanjut tentang itu di http://www.in-ulm.de/~mascheck/various/find/#shell). Itu berarti untuk waktu yang lama untuk sh (yang bergantung pada sistem yang didasarkan pada shell Bourne, Almquist atau Korn), Anda tidak tahu apakah argumen pertama masuk ke $0 atau $1 , jadi untuk portabilitas, Anda harus melakukan hal-hal seperti:

sh -c 'echo foo in "$1"' foo foo

Atau:

sh -c 'shift "$2"; echo txt files are "[email protected]"' tentative-arg0 3 2 *.txt

Untungnya, POSIX telah menentukan perilaku baru di mana argumen pertama masuk $0 , jadi sekarang kita bisa melakukan:

sh -c 'echo txt files are "[email protected]"' meaningful-arg0-for-error *.txt

Linux
  1. Bash Array Dengan Contoh

  2. Pernyataan Bash If-Else Dengan Contoh

  3. Parameter Khusus Bash Dijelaskan dengan 4 Contoh Skrip Shell

  1. Parameter Posisi Bash Dijelaskan dengan 2 Contoh Skrip Shell

  2. Bagaimana cara meneruskan parameter ke skrip Bash?

  3. Alias ​​​​dengan variabel di bash

  1. Menambahkan stempel waktu ke nama file dengan mv di BASH

  2. Bash:tunggu dengan batas waktu

  3. Linux Bash XMLLINT dengan XPATH