Запустить скрипт в текущей оболочке без. перед командованием


26

Если скрипт должен быть выполнен в текущей оболочке, это может быть достигнуто путем добавления точки перед командой:

   . ./somescript.sh

Есть ли способ сделать это, не набирая точку каждый раз? Например команда для перехода на родительскую оболочку из самого скрипта?

Ответы:


22

Это может быть не совсем то, что вы хотите, но вы можете сделать:

alias somescript.sh='. ./somescript.sh'

2
Это решило мою проблему отлично. Спасибо!
алу

8

Есть ли способ сделать это, не набирая точку каждый раз? Например команда для перехода на родительскую оболочку из самого скрипта?

Я не думаю, что есть (кроме ввода source somescript.sh, но это, вероятно, не то, что вы ищете ^^).

Если вы запускаете скрипт как обычно ./somescript.sh, то оболочка разветвляется и запускает эту команду. Он передает команду ядру, а затем ядро ​​решает, как выполнить эту команду, анализируя #!строку внутри скрипта. Затем ядро ​​запускает указанный интерпретатор (в этом случае, вероятно,bash подоболочка). Поэтому изменения, somescript.shвносимые в его среду, изолированы в подоболочке, не затрагивая родительскую оболочку.

Если вы хотите, чтобы оболочка читала сам скрипт, не запуская другой процесс, вы должны явно указать это с помощью ключевого слова .or source.


Спасибо за подробное объяснение. :) Теперь я вижу, что нет способа сделать это из вызываемого скрипта, но, к счастью, родительской оболочке можно сказать не создавать подоболочку с помощью aliasкоманды, как предложил Скотт.
алу

1

Если вы выполняете ./somescript.shкак внешнюю программу, она не может ничего сделать внутри запущенного процесса оболочки, например, получить доступ к неэкспортированным переменным, установить переменные, изменить текущий каталог и т. Д. Обойти это невозможно.

(Ну, ладно, вы можете запустить отладчик из подпроцесса и настроить память родительского процесса. Но если вы попробуете это, наиболее вероятным результатом будет сбой родительской оболочки.)

Вам нужно бежать . ./somescript.sh. Вы можете скрыть это за псевдонимом или функцией, если хотите, но опять-таки определение псевдонима или функции должно быть сделано в родительской оболочке.


0

Я думаю, что скрипт, который вы пытаетесь запустить, не исполняемый. chmod a+x somescript.shдобавит бит выполнения для пользователя, группы и других (ugo) в этот файл. Первая строка файла также будет нуждаться в #! линия сверху, вроде бы #!/bin/bash.

ls -l somescript.shпокажет вам триплеты RWX (чтение / запись / выполнение) для файла. Ему понадобится, по крайней мере, первый набор символов, если вы владеете файлом.


Сценарии сами по себе работают нормально, но я хочу выполнить их в текущей оболочке, чтобы иметь возможность изменять переменные среды оболочки.
алу

Если экспорт переменной, которую вы хотите в сценарии, не работает, как, например, export PATH=$PATH:/usr/local/binдобавление / usr / local / bin в вашу переменную $ PATH, тогда вам нужно найти исходный файл для изменения переменных вашей рабочей среды. Этот вопрос на самом деле «Как программно изменить переменные окружения в моей работающей оболочке из сценария bash?» Сценарий . ./somescript.shвыполняется просто отлично - вы используете команду dot для поиска в файле. tcsh использует «источник» для того же самого.
AR Diederich

Изменение переменной было только примером. Мой вопрос заключается в том, можно ли сказать оболочке, что должна быть точка, не записывая ее (например, из самого скрипта)
alu

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

0
export PATH=$PATH:.

Выполнение этой команды в оболочке или добавление ее в файл конфигурации оболочки добавит текущий каталог в переменную PATH. Переменная PATH - это список каталогов, в которых ваша оболочка будет искать исполняемые файлы при выполнении команды.

Это позволит вам запустить любой исполняемый файл в текущем каталоге без ./


1
ОП спрашивает о первом, а .не о том, ./что является частью имени файла. Запуск ./somescript не выполняет его в текущей оболочке, как это . ./somescriptпроисходит.
Anthon
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.