bash4.3 # pwd
/bin
bash4.3 # ll sh
lrwxrwxrwx. 1 root root 4 May 17 22:22 sh -> bash
bash4.3 # ll bash
-rwxr-xr-x. 1 root root 1072056 May 17 22:22 bash
bash4.3 # bash
bash4.3 # sh
sh-4.3#
OS saya adalah fedora 24 (Versi GNOME default).
Dari contoh itu, kita bisa tahu: di bawah /bin
, bash
adalah biner yang dapat dieksekusi; sh
adalah tautan lunak ke bash
.
Jadi, setahu saya, type bash and press enter
harus menghasilkan hasil yang sama persis seperti type sh and press enter
.
Ketika saya type bash and press enter
, Saya mendapat [root@localhost bin]#
seperti yang diharapkan.
Namun, jika saya type sh and press enter
, Secara mengejutkan saya dapatkan sh-4.3#
.
Apa penyebabnya
Jawaban:
Itu adalah fitur yang terdokumentasi.
Jika Anda menjalankan bash melalui symlink bernama
sh
, bash akan dimulaish
mode kompatibilitas.Dari
man bash
:Bagaimana suatu program tahu nama apa yang digunakan untuk memulainya?
Jika ini adalah program c, ia dapat memeriksa
argv[0]
. Jika ini adalah skrip shell atau perl, ia dapat memeriksa$0
.Sebagai contoh, mari kita pertimbangkan skrip shell sederhana ini:
$0
adalah nama yang dipanggil oleh skrip.${0##*/}
adalah nama yang disebut skrip dengan nama direktori yang dihapus.Mari kita buat symlink ini:
Begitu,
utc
danet
keduanya menjalankan executable yang sama tetapi mereka memberikan hasil yang berbeda. Saat dijalankan sebagaiutc
, ini menghasilkan waktu universal. Saat dijalankan sebagaiet
, adalah output waktu AS Timur. Sebagai contoh:sumber
argv[0]
, obvs)