Dalam menafsirkan diagram alur ini
Saya menemukan bahwa dalam bash manusia:
Ketika bash dipanggil sebagai shell login interaktif, atau sebagai shell non-interaktif dengan opsi --login, ia pertama kali membaca dan menjalankan perintah dari file / etc / profile, jika file itu ada.
Itu menyatakan bahwa shell login interaktif membaca /etc/profile
(tanpa --noprofile)
Juga, kerang non-interaktif dengan opsi --login
baca/etc/profile
Itu tampaknya meninggalkan beberapa kemungkinan shell login (di mana $0
dimulai dengan a -
) yang non-interaktif (menjalankan skrip, mungkin sesederhana date
) mungkin tidak membaca (sumber) /etc/profile
.
Untuk mengkonfirmasi atau menolak ide ini:
Pertama saya mencoba menggunakan su -l -
, yang memulai shell login dengan -
sebagai karakter pertama tetapi saya gagal membuatnya non-interaktif (dan dapat menyajikan tes untuk menyelidiki itu).
Memanggil sesuatu seperti
$ bash -c 'date' -bash
Tidak melaporkan sebagai shell login (bahkan jika karakter pertama adalah a -
).
Coba ini untuk mengungkapkan detailnya:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
The
$0
memiliki-
sebagai karakter pertama, tidak adai
(interaktif) dalam nilai$-
tetapi tidak dilaporkan sebagailogin_shell
(u yang). Dalam hal ini, / etc / profile tidak dibaca, tetapi saya tidak yakin ini adalah tes yang tepat.
Ada juga yang menyebutkan "kerang masuk non-interaktif yang langka" dalam jawaban ini tanpa cukup spesifik untuk pertanyaan ini.
The Kesimpulan dari orang ini adalah bahwa /etc/profile
selalu dibaca.
Baca tabel ringkasan: baik shell login interaktif maupun non-interaktif dibaca /etc/profile
Dan, jika contoh dari halaman ini benar:
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
Tes exec su - bob -c 'env'
laporan yang /etc/profile
dibaca.
Pendeknya:
Apakah mungkin untuk memiliki shell login non-interaktif (tidak dipanggil dengan --login atau -l)?
Dan jika benar, apakah itu membaca /etc/profile
file?
Jika hal di atas benar, kita harus menyimpulkan bahwa SEMUA shell login [interaktif (atau tidak)] membaca / etc / profile (tanpa --noprofile
opsi).
Catatan: untuk mendeteksi bahwa / etc / profile sedang dibaca, cukup tambahkan di awal file perintah ini:
echo "'/etc/profile' is being read"
--login
opsi. Untuk yang kedua, jika sayaexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
mendapatkan (disandikan dalam C qoutes)$'/etc/profile read\nshopt -s login_shell\nbash himBH'
demikian, ini adalah login tetapi interaktif. Kami membutuhkan login dan non-interaktif . Apa yang saya lewatkan?<<<"$-"
, yang$-
diperluas oleh shell panggilan karena tanda kutip ganda. Shell yang disebut tidak interaktif karena stdinnya bukan tty.exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF
untuk mendapatkan konfirmasi ini:$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'
Jadi, ya, shell login non-interaktif adalah mungkin, dan masih dibaca/etc/profile
. Haruskah kita menyimpulkan bahwa SEMUA shell login membaca/etc/profile
?exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF
, :).bash
penanganan file start-up cukup kacau IMO, Anda akan menemukan bahwa beberapa sistem telah menambalnya untuk memiliki perilaku yang lebih masuk akal menambahkan variasi lebih banyak.Ya, shell login non-interaktif dimungkinkan
sumber
su -c 'echo hello' -
. Yang, untuk menguji apa yang kita butuhkan, harus ditulis sebagai:su -c 'echo $0 $-; shopt -p login_shell' -
untuk mendapatkan jawaban ini mengkonfirmasikan (dikodekan dalam tanda kutip C):$'/etc/profile read \n -su hBc \n shopt -s login_shell'
. Itu mengonfirmasi bahwa shell non-interaktif masuk dikecualikan dan bahwa, dalam proses, / etc / profile telah dibaca. Terima kasih.IYA.
Namun, perhatikan bahwa
/etc/profile
tidak akan digunakan untuk shell login yang tidak berinteraksi kecuali--login
argumen diberikan.Idiom umum yang menggunakan shell login non-interaktif adalah:
Tapi ini menderita fakta yang
/etc/profile
tidak bisa dieksekusi.Dimungkinkan untuk mengubah perilaku ini tetapi melibatkan mengubahsuaikan kode sumber Bash pada waktu kompilasi dengan membatalkan komentar opsi yang ditemukan di config-top.h :
Ketika saya meneliti
su
anomali ini , saya menemukan bahwa cangkang lain termasukzsh
dandash
tidak memiliki perbedaan ini.sumber