Mengapa softlink ini tidak berfungsi seperti yang diharapkan?


11
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


Teks yang bisa dengan mudah disalin-tempel ke editor SE karena gambarnya cukup mengganggu, jadi jangan lakukan ini. Sebagai gantinya, pilih teks di terminal Anda dan tekan CTRL-SHIFT-C.
cat

Jawaban:


25

Itu adalah fitur yang terdokumentasi.

Jika Anda menjalankan bash melalui symlink bernama sh, bash akan dimulai sh mode kompatibilitas.

Dari man bash:

Jika bash dipanggil dengan nama sh, ia mencoba untuk meniru   perilaku startup versi historis sh semirip mungkin,   sementara menyesuaikan dengan standar POSIX juga. Saat dipanggil sebagai   shell login interaktif, atau shell non-interaktif dengan --login   opsi, pertama mencoba untuk membaca dan menjalankan perintah dari   / etc / profile dan ~ / .profile, dalam urutan itu. Opsi --noprofile   dapat digunakan untuk menghambat perilaku ini. Ketika dipanggil sebagai interaktif   shell dengan nama sh, bash mencari variabel ENV, perluas   nilai jika didefinisikan, dan menggunakan nilai yang diperluas sebagai nama   file untuk dibaca dan dieksekusi. Karena shell dipanggil sebagai sh tidak   mencoba membaca dan menjalankan perintah dari file startup lainnya, the   Opsi --rcfile tidak berpengaruh. Shell non-interaktif yang dipanggil dengan nama sh tidak berusaha membaca file startup lainnya. Kapan   dipanggil sebagai sh, bash memasuki mode posix setelah file startup   Baca baca.

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:

$ cat utc
#!/bin/sh
case "${0##*/}" in
        utc) date -u ;;
        et) TZ=US/Eastern date ;;
esac

$0 adalah nama yang dipanggil oleh skrip. ${0##*/} adalah nama yang disebut skrip dengan nama direktori yang dihapus.

Mari kita buat symlink ini:

ln -s utc et

Begitu, utc dan et keduanya menjalankan executable yang sama tetapi mereka memberikan hasil yang berbeda. Saat dijalankan sebagai utc, ini menghasilkan waktu universal. Saat dijalankan sebagai et, adalah output waktu AS Timur. Sebagai contoh:

$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016

4
Mungkin ingin menambahkan bagaimana ini mungkin, karena OP mengharapkan panggilan menjadi identik. ( argv[0], obvs)
Lightness Races in Orbit

@LightnessRacesinOrbit Ide bagus. Saya menambahkan contoh.
John1024

Sempurna sekarang. :)
Lightness Races in Orbit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.