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

Bruce и ams дали красивые ответы, объясняющие поведение позади. Но на самом деле сделать ls ../foo Вы спрашивали, Вы могли пойти с чем-то как

ls $(dirname $PWD)/foo
26
28.11.2013, 02:02
5 ответов

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

alias somescript.sh='. ./somescript.sh'
22
27.01.2020, 19:40
  • 1
    Это решило мою проблему отлично.Спасибо! –  alu 28.11.2013, 15:12

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

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

Если Вы запускаете скрипт, как обычно, с ./somescript.sh, затем ветвления оболочки и должностные лица эта команда. Это передает команду ядру, и затем ядро решает, как эта команда должна быть выполнена путем парсинга #! строка в сценарии. Ядро затем запускает указанный интерпретатор (в этом случае, вероятно, a bash подоболочка). Для этого модификации somescript.sh делает к его среде, изолируются в подоболочке, не влияя на родительскую оболочку.

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

8
27.01.2020, 19:40
  • 1
    Спасибо за подробное объяснение.:) Теперь я вижу, что нет никакого способа делать это из названного сценария, но fortuntly, родительской оболочке можно сказать не создать подоболочку с alias команда, как предложенный scott. –  alu 28.11.2013, 15:20

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

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

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

1
27.01.2020, 19:40

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

ls -l somescript.sh покажет Вам, rwx триплеты (читали/писали/выполняли) для файла. Этому будет нужен x, по крайней мере, в первом наборе, предполагая владение файлом.

0
27.01.2020, 19:40
  • 1
    , которым сам хорошо работают сценарии, но я хочу выполнить его в текущей оболочке, чтобы смочь изменить переменные среды оболочки. –  alu 28.11.2013, 01:33
  • 2
    При экспорте переменной Вы хотите в сценарии, не работает, как export PATH=$PATH:/usr/local/bin для добавления/usr/local/bin к $PATH затем действительно необходимо получить файл для замены переменных рабочей среды. Этот вопрос действительно, "Как я программно изменяю свои переменные среды в моей рабочей оболочке из сценария удара?" Сценарий . ./somescript.sh выполняется очень хорошо - Вы используете точечную команду для источника в файле. tcsh использует "источник" для того же самого. –  A. R. Diederich 28.11.2013, 01:51
  • 3
    Изменение переменной было просто примером. Мой вопрос состоит в том, возможно ли сказать оболочке, что должна быть точка, на самом деле не пишущий это (например, из самого сценария) –  alu 28.11.2013, 01:58
  • 4
    О точке можно было бы легко забыть, который может изменить поведение сценария полностью. –  alu 28.11.2013, 01:59

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

enter image description here

Это позволит вам запустить любой исполняемый файл в текущем каталоге без [1122438]./[12120]
0
27.01.2020, 19:40

Теги

Похожие вопросы