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