Черта (-) перед башой

14

Если я исследую мою Баш оболочки в качестве OS X (10.6.4) терминала, например, путем вводом echo $0, есть тир перед моей оболочкой, как это: -bash. Что означает этот штрих?

marshall.ward
источник

Ответы:

14

Это означает, что bashвызывается как оболочка входа в систему.


man bash говорит:

Войти оболочка, чей первый символ аргумента нуль является -, или запущенная с --loginопцией.

Когда bash вызывается как интерактивная оболочка входа в систему или как неинтерактивная оболочка с --loginпараметром, она сначала читает и выполняет команды из файла /etc/profile, если этот файл существует. После прочтения этого файла, он ищет ~/.bash_profile, ~/.bash_loginи ~/.profile, в таком порядке, и читает и выполняет команду из первого, который существует и читаемые. Эта --noprofileопция может использоваться, когда оболочка запущена, чтобы запретить это поведение.

Когда оболочка входа в систему закрывается, bash читает и выполняет команды из файла ~/.bash_logout, если он существует.


Вы найдете login -pfв psвыводе, который запускает оболочку входа по умолчанию.

Попробуйте запустить login -pfи login -pflувидите разницу. man loginописывает разницу:

-lСообщает программе, выполняемой при входе в систему, что это не сеанс входа в систему (по соглашению, сеанс входа в систему передается программе с дефисом в качестве первого символа argv[0]; эта опция отключает это), и предотвращает ее попадание chdir(2)в домашний каталог пользователя. , По умолчанию добавляется дефис (это сеанс входа в систему).

Даниэль Бек
источник
Отличный ответ, спасибо за объяснения и manцитирую
marshall.ward
1
Я использую Ubuntu, и я вижу различные варианты поведения echo $0: если я наберу echo $0в терминале, вызванном ctrl + alt + f1, результат -bash; но если я наберу это в termianl, вызванном ctrl + alt + t, результат будет bash(без начального тире). Не могли бы вы объяснить, почему?
Замороженное пламя
@ Frozen-Flame Один - это оболочка для входа, другой - нет. Обратите внимание, что терминалы OS X и Linux имеют различное поведение в этом отношении.
Даниэль Бек
@DanielBeck, это не доказательство того, что другой не является оболочкой входа в систему. Когда bash запускается с --loginаргументом, он не меняет его argv[0], но действует как оболочка входа.
Руслан
@Ruslan Конечно, теоретически это может быть оболочка для входа. Но это не так. (По крайней мере, я был бы очень удивлен, если бы это было.)
Даниэль Бек