Чому "echo $ 0" дає різний результат для двох різних терміналів?


15

Я відкрив термінал на Ubuntu за допомогою Ctrl+ Alt+ Tта іншого терміналу, перейшовши в каталог, а потім клацнувши правою кнопкою миші та вибравши "Відкрити в терміналі".

Я зробив це echo $0в обох випадках.

У першому випадку:

$ echo $0
-bash

У другому випадку:

$ echo $0
/bin/bash

Чому така різниця?


$ 0 повертає ім'я запущеного процесу.
Рамеш

Ви запускаєте два термінали з іншим користувачем?
cuonglm

Я використовую того самого користувача
CodeBlue


Це насправді різні емулятори терміналу або лише два екземпляри одного емулятора терміналу? Вони обидва термінали за замовчуванням?
terdon

Відповіді:


16

Якщо результат echo $0команди є, -bashце означає, що bashйого викликали як оболонку входу. Якщо вихід лише bash, ви знаходитесь в оболонці, яка не входить у систему.

man bash каже десь у рядку 126:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

Детальніше про тут: Різниця між оболонкою для входу та оболонкою без входу? .

Тепер, щоб пояснити, чому ви потрапляєте /bin/bashу другому випадку, я можу сказати, що програма (у вашому випадку ваш файловий менеджер, можливо, nautilus) або сценарій можуть змінити свою власну $0на щось інше. Як приклад дивіться, що відбувається з $0моїм терміналом (той самий термінал весь час):

введіть тут опис зображення


12

Різниця полягає в тому, як вони були розпочаті. bash буде ініціалізуватися по-різному (читати різні сценарії запуску), залежно від argv [0]. Якщо рядок починається з дефісу, -як і -bashтоді, він працює як оболонка для входу, якщо ні, він буде працювати як інтерактивна оболонка. Він також може працювати як неінтерактивна оболонка (тобто в сценарії оболонки).

Щоб дізнатися більше, краще прочитати посібник, man bashрозділ ІНВОКАЦІЯ.


9

Оболонка запускається при вході, але він також почав програми , як make, або при виконанні сценарію оболонки, або при введенні :shв viабо при створенні нового вікна терміналу.

Спочатку оболонка читалася ~/.profileпід час входу в систему чи запуску su. Цей сценарій буде таким, як оголосити, чи є у вас нова електронна пошта, налаштувати стирання та вбивство символів, а також встановити та експортувати змінні TERM і PATH. Коли було запущено практично в будь-якому іншому контексті, оболонка не читала ~/.profile, тому що робити більшість цих речей було б зайвим. Ви повинні були експортувати будь-які важливі змінні оболонки до нової оболонки.

Шлях оболонки , чи знав читати в ~/.profileтому , щоб перевірити , є чи перший символ argv[0]ака $0був '-'.

Починаючи з того csh, були представлені псевдоніми. Псевдоніми не експортували в навколишнє середовище. cshбув розроблений для читання у двох різних сценаріях ініціалізації. ~/.loginбуло прочитано лише тоді, коли користувач увійшов у систему, і підказкою для цього було, якщо argv[0]почалося з '-'. ~/.cshrcчиталася щоразу, коли оболонка запускалася. Загалом, один розміщений псевдоніми, ~/.cshrcа все інше в ~/.login. cshтакож підтримується ~/.logout, що в більшості випадків просто очищає екран і запускається fortune.

Інші оболонки прийняли ці самі особливості. kshчитатиме ~/.kshrc, bashбуде читати ~/.bashrc, і ті були , де б розмістити визначення псевдонімів.

Отже, якщо коротко розповісти, додаток, що породжує оболонку, повинен вирішити, чи повинна це бути "оболонка для входу", і в цьому випадку це є '-'на початку, або звичайна оболонка. У більшості випадків оболонка, яка буде інтерактивною, запускається як оболонка для входу, а оболонка призначена просто для виконання деяких команд, як аргументів, так і зі скрипту, а вихід - звичайна оболонка.

Але все залежить від примхи програми, яка запускає оболонку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.