Почему в моей командной строке echo $ 0 возвращает "-"? - PullRequest
4 голосов
/ 10 декабря 2011

Когда я набираю echo $0 Я вижу -

Я ожидаю увидеть bash или какое-нибудь имя файла, что это значит, если я просто получу "-"?

Ответы [ 3 ]

6 голосов
/ 10 декабря 2011

Дефис перед $0 означает, что эта программа является оболочкой входа в систему.

примечание: $0 не всегда содержит точный путь к исполняемому исполняемому файлу, поскольку существует способ переопределить его, когдазвонить execve(2).

1 голос
/ 10 декабря 2011

Итак, основываясь на одном из ваших комментариев, вы действительно хотите знать, как определить, какую оболочку вы используете; вы предположили, что $0 было решением, и спросили об этом, но, как вы видели, $0 не будет достоверно сообщать вам то, что вам нужно знать.

Если вы используете bash, то будет установлено несколько неэкспортированных переменных, включая $BASH_VERSION. Если вы используете tcsh, то будут установлены переменные оболочки $tcsh и $version. (Обратите внимание, что $version является чрезмерно общим именем; я столкнулся с проблемами, когда некоторые общесистемные сценарии запуска устанавливают его и блокируют переменную, специфичную для tcsh. Но $tcsh должен быть надежным.)

Однако настоящая проблема заключается в том, что синтаксис bash и tcsh в основном несовместим. Может быть возможно написать сценарий, который может выполняться при вызове (через . или source) из tcsh или bash, но это будет сложно и безобразно.

Обычный подход состоит в том, чтобы иметь отдельные установочные файлы, по одному для каждой используемой оболочки. Например, если вы используете bash, вы можете запустить

. ~/setup.bash

или

. ~/setup.sh

и если вы используете tcsh, вы можете запустить

source ~/setup.tcsh

или

source ~/setup.csh

Версии .sh или .csh относятся к предкам обеих оболочек; имеет смысл использовать эти суффиксы, если вы не используете какие-либо специфичные для bash или tcsh функции.

Но для этого нужно знать, какую оболочку вы используете.

Возможно, вы могли бы создать псевдоним в вашем .cshrc, .tcshrc, or .login , and an alias or function in your .profile , .bash_profile , or .bashrc`, который будет вызывать любой скрипт, который вам нужен.

Или, если вы хотите выполнять настройку при каждом входе в систему или при каждом запуске новой интерактивной оболочки, вы можете поместить команды непосредственно в соответствующий файл (ы) запуска оболочки. Конечно, команды будут отличаться для tcsh против bash.

1 голос
/ 10 декабря 2011

Я получаю '-bash', несколько недель назад я играл с изменением имени процесса, видимого при запуске ps или top/htop или echo $0.Чтобы ответить на ваш вопрос напрямую, я не думаю, что это что-то значит.Echo - встроенная функция bash, поэтому, когда он проверяет список аргументов, bash фактически выполняет проверку и видит себя там.

Ваша интуиция верна, если вы написали echo $0 в скриптефайл и запустить его, вы увидите имя файла сценария.

...