2016-09-14 4 views
1

У меня есть следующий сценарий, созданный каким-либо самостоятельно утверждал эксперт Баш:

SCRIPT_LOCATION="$(readlink -f $0)" 
SCRIPT_DIRECTORY="$(dirname ${SCRIPT_LOCATION})" 
export PYTHONPATH="${PYTHONPATH}:${SCRIPT_DIRECTORY}/util" 

Это работает хорошо на моем местном Ubuntu 16.04. Теперь я хотел использовать его на наших серверах RH 7.2; и там я получил сообщение об ошибке от readlink; о вызове с плохими параметрами.

Тогда я понял: на Ubuntu, $ 0 дает «bash»; тогда как на RH он дает «-башу».

EDIT: сценарий вызывается как . ourscript.sh

Вопросы:

  1. Любая идея, почему это?
  2. Когда я меняю свой сценарий на использование hardcoded readlink -f bash, все работает. Существуют ли «лучшие» способы для этого?
  3. Вы можете объяснить, что readlink -f Баш на самом деле делает ;-)
+0

Как вы используете скрипт? – 123

+4

'$ 0' не должен содержать' bash' внутри скрипта. Убедитесь, что вы правильно проверили. – Mat

+0

Обновлен мой вопрос. – GhostCat

ответ

3

Как сценарий добыт readlink -f $0 не имеет смысла, поскольку это будет просто показать вам команду, используемую для запуска оболочки вы в настоящее время с помощью.

Чтобы объяснить различие в команде позволяет посмотреть на странице Баш человека:

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

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

Так что угадай, что ubuntu начинается с опции noprofile.

Что касается readlink, мы можем еще раз посмотреть на человеке странице

-f, --canonicalize канонизировать, следуя все символьные ссылки в каждом компоненте заданного имени рекурсивно; все, кроме последнего компонента, должны существовать

Поэтому он следует символическим ссылкам на базу.

Использование readlink -f с любым неконкурентным путем приведет к тому, что он просто добавит последний аргумент в ваш текущий рабочий каталог, который фактически не покажет, где выполняется скрипт.

Попробуйте положить любую случайную строку вместо bash после нее и увидите, что скрипт не затронут.

e.г

readlink -f dafsfdsf 

Возвращает

/home/me/testscript/dafsfdsf 
Смежные вопросы