Saya membaca perbedaan antara sudo -i/-s
sini . Setelah menggunakan perintah shopt
, dicatat bahwa semua ( sudo su/sudo -i/sudo -s
) $SHELL
memberikan hasil yang sama, tetapi shopt
hasil perintah berbeda.
Jadi, bagaimana cara mendefinisikan shell login dan non login?
Dari mana shopt
mendapatkan hasilnya?
Mengapa itu tidak terkait $SHELL
?
sudo su
givinv@87-109:~$ sudo su
root@87-109:/home/givinv#
root@87-109:/home/givinv#
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv#
root@87-109:/home/givinv# exit
givinv@87-109:~$
sudo -i
givinv@87-109:~$ sudo -i
root@87-109:~#
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
sudo -s
root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
command-line
bash
sudo
prado
sumber
sumber
.profile
atau setara), dan 2. Shell yang seharusnya dimulai saat login untuk sebuah pengguna, sebagaimana didefinisikan dalam/etc/passwd
atau setara.$SHELL
berisi yang terakhir,shopt
output Anda berurusan dengan yang pertama. Biasanya, ketika shell dalam (2) dimulai pada saat login, itu dimulai dengan cara khusus yang diperlukan untuk (1), maka dari itu pengubahan makna.$SHELL
(dan menghubungkannya ke terminal semu) yang pada gilirannya didefinisikan dalam entri / etc / passwd Anda. shell ini adalah shell login dan dapat diuji denganif [[ -o login ]]; then echo "I am a login shell"; fi
. menjadi shell login akan melakukan tugas-tugas yang sesuai dengan sesi baru. mis. sumber~/.zprofile
atau yang serupa yang mungkin akan mengatur variabel lingkungan dan kode shell khusus apa pun yang mungkin ingin Anda jalankan saat iniJawaban:
TL; DR :
/etc/passwd
.sudo su
/sudo su -
/sudo -i
/sudo -s
sama? Tidak, mereka semua menghasilkan cangkang tetapi berbeda dan dalam konteks yang berbeda.$SHELL
harus dilakukan Katakan saja shell default Anda, sama seperti di/etc/passwd
.Jawaban Aktual :
Pertama-tama, penting untuk menyebutkan bahwa
shopt
itu spesifik-bash. Sebagai contoh, sayamksh
pengguna shell, dan tidak memilikishopt
, sama sepertiksh
tidak.Selanjutnya, apa sebenarnya
login_shell
yang harus diwakili? Dariman bash
:Itulah poin kuncinya.
sudo -i
, seperti yang sudah Anda ketahui dari jawaban sebelumnya yang Anda baca, seharusnya mensimulasikan login awal. Itu sebabnyashopt
laporanlogin_shell on
untuk opsi ini. Pikirkan ini seolahsudo -i
memaksa shell untuk pergi melalui file yang seharusnya hanya muncul selama proses login (yang tidak bersumber dari shell interaktif).Dalam kasus lain, Anda sudah menjalankan instance dari shell, jadi itu tidak bisa menjadi shell login di tempat pertama, dan tujuan dari opsi berbeda.
sudo -s
hanya membaca$SHELL
(yang dimaksudkan untuk mewakili shell default Anda sebagaimana diatur dalam/etc/passwd
) variabel dan menjalankannya dengan hak akses root. Ini sama dengan melakukansudo $SHELL
atausudo mksh
atausudo bash
(mana pun yang Anda gunakan).Ingat saya sebutkan bahwa saya
mksh
pengguna? Lihatlah ini:Apa yang Anda lihat adalah yang
sudo -s
melompat dari shellbash
sayamksh
, dengan prompt karakteristik yang saya tetapkan untuk itu. Dan tentu saja, karena ini bukan tindakan masuk, karenabash
akan melaporkan bahwa shell muncul sebagai contoh shell non-login. Dalam kasus saya, Anda melihat bahwa$-
tidakl
ada surat di sana, yang akan ada di sana jika itu adalah contoh shell login.Akhirnya, ide yang sama berlaku untuk
sudo su
dansudo su -
. Kemudian satu spawns instance shell login (yaitu, file spesifik yang diperlukan untuk login akan berjalan) dan yang pertama hanya memunculkan shell interaktif (yaitu, file login tidak berjalan).Jadi secara teknis,
shopt login_shell
tidak ada hubungannya dengan$SHELL
apa pun. Pikirkan seperti ini: tujuannya adalah untuk menunjukkan bagaimana bash berjalan.$SHELL
seharusnya hanya mencerminkan apa yang telah Anda tetapkan/etc/passwd
.Adapun perbedaan antara shell login dan shell non-login, telah dijelaskan oleh Gilles yang sangat dihormati di unix.stackexchange.com dalam jawaban ini .
Menyenangkan tambahan
Inilah sesuatu yang menyenangkan yang bisa Anda coba. Seperti yang mungkin sudah Anda ketahui, shell login akan berjalan
.profile
(dan.bashrc
karena Ubuntu.profile
dikonfigurasikan untuk melakukannya ), tetapi neraka non-login hanya akan menjalankan.bashrc
file. Jadi kita dapat menguji denganecho
perintah mana yang menjalankan shell login dan mana yang tidak, dan kami mengharapkan dua barisecho
untuk shell login dan hanya satu untuk non-login.Cukup tepat, mereka yang memiliki dua jalur output akan
login_shell
diatur keon
.sumber
$SHELL
danlogin_shell/non-login_shell
diklarifikasi. Tapi dari manashopt
mendapatkan detail? Apakah itu dariecho $0
?$0
digunakan untuk menentukan apakah shell adalah shell login, jadi jikashopt
akan memeriksa variabel itu - tentu, itu bisa diterima. Namun, mungkin ada lebih dari yang terlihat.shopt
mungkin Untuk pertanyaan ini, saya tidak memiliki jawaban yang sulit, karena saya tidak terbiasa dengan kode sumber bash dengan baik.-
, atau dengan menggunakan-l
opsi.login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.
agarshopt login_shell
tampaknya menjadi satu arah, Anda dapat mencari tahu - secara terprogram cara mengetahui bagaimana hal itu dimulai. cara lain adalah[[ -o login ]]
Ketika @Serg menjelaskan dalam jawaban ini tentang cara memberi tahu shell apa yang Anda jalankan ,
SHELL
variabelnya hanyalah shell default pengguna saat ini seperti yang dibaca dari/etc/passwd
:jadi jika saya
echo $SHELL
akan selalu kembali/bin/bash
:Apakah atau tidak shell adalah shell login, adalah sh ell opt ion ditentukan pada saat shell dimulai. Program shell menyimpan informasi ini bersama dengan semua pengaturan dan variabel lainnya. The
shopt
perintah menyediakan cara untuk melihat informasi ini dan, jika mungkin untuk opsi tersebut, untuk mengatur atau unset itu (ini bukan kasus untuklogin_shell
yang, tentu saja, tergantung pada proses yang digunakan untuk memulai shell)Opsi
sudo
program menentukan bagaimana berbagai jenis shell root akan dimulai:sumber
shopt
danlogin_shell
seharusnya mewakili jauh lebih baik dari jawaban saya.man bash
:man login
:Pendeknya:
$SHELL
diatur olehlogin
atau oleh program pemohon, misalnyasu
. Shell itu sendiri tidak mengaturnya.shopt
menunjukkan opsi shell yang sedang berlaku.sumber