Почему «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.