Biasanya, $0
dalam sebuah skrip diatur ke nama skrip, atau untuk apa pun itu dipanggil sebagai (termasuk path). Namun, jika saya gunakan bash
dengan -c
opsi, $0
disetel ke argumen pertama yang diberikan setelah string perintah:
bash -c 'echo $0 ' foo bar
# foo
Efeknya, 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 ini untuk string perintah? Perhatikan bahwa saya mencari alasan, alasannya, di balik penerapan perilaku aneh tersebut.
Orang bisa berspekulasi bahwa string perintah seperti itu tidak akan membutuhkan $0
parameter seperti yang biasanya didefinisikan, jadi untuk ekonomi juga digunakan untuk argumen normal. Namun, dalam hal itu perilaku shift
aneh. Kemungkinan lain adalah yang $0
digunakan untuk mendefinisikan perilaku program (ala bash
disebut sebagai sh
atau vim
disebut sebagai vi
), tetapi itu tidak bisa, karena di $0
sini hanya terlihat dalam string perintah dan bukan oleh program yang dipanggil di dalamnya. Saya tidak bisa memikirkan kegunaan lain untuk apa $0
, jadi saya bingung menjelaskan hal ini.
echo 'echo the other side of this pipe globs "$@"' | sh -s -- *
, meskipun, sayangnya, $0
umumnya bukan parameter yang -s
dapat diatur dengan opsi tream ... Ini dapat digunakan dalam banyak cara yang sama pada xargs
umumnya. Dan lainnya selain itu.
--
, maka itu bisa saja memiliki interpretasi biasa 'dari sini mulai argumen', terlihat di beberapa program lain. Kemudian lagi, itu bisa membingungkan mereka yang tidak terbiasa -c
untuk berpikir --
sebenarnya memiliki interpretasi itu.
-
untuk$0
argumen sebagai idiom, seperti dish -c 'foo $1 $2' - a b
. Dengan cara ini terlihat cukup normal (setelah Anda mengetahui apa-
artinya itu)