Bruce и ams дали красивые ответы, объясняющие поведение позади. Но на самом деле сделать ls ../foo
Вы спрашивали, Вы могли пойти с чем-то как
ls $(dirname $PWD)/foo
Это не может быть точно, что Вы хотите, но Вы могли сделать:
alias somescript.sh='. ./somescript.sh'
Существует ли способ сделать это, не вводя точку каждый раз? Например, команда для изменения на родительскую оболочку из самого сценария?
Я не думаю, что существует (кроме ввода source somescript.sh
, но это, вероятно, не, что Вы ищете ^^).
Если Вы запускаете скрипт, как обычно, с ./somescript.sh
, затем ветвления оболочки и должностные лица эта команда. Это передает команду ядру, и затем ядро решает, как эта команда должна быть выполнена путем парсинга #!
строка в сценарии. Ядро затем запускает указанный интерпретатор (в этом случае, вероятно, a bash
подоболочка). Для этого модификации somescript.sh
делает к его среде, изолируются в подоболочке, не влияя на родительскую оболочку.
Если Вы хотите, чтобы оболочка прочитала сам сценарий, не запуская другой процесс, явно необходимо сказать это при помощи .
или source
ключевое слово.
alias
команда, как предложенный scott.
– alu
28.11.2013, 15:20
Если Вы выполняетесь ./somescript.sh
как внешняя программа, это ничего не может сделать в рабочем процессе оболочки, таком как доступ к неэкспортируемым переменным, установка переменных, изменение текущего каталога, и т.д. Нет никакого пути вокруг этого.
(Ну, хорошо, Вы можете выполнять отладчик от подпроцесса и настраивать память родительского процесса. Но если Вы пробуете его, наиболее вероятный результат разрушает родительскую оболочку.)
Необходимо работать . ./somescript.sh
. Можно скрыть это позади псевдонима или функционировать, если Вам нравится, но снова псевдоним или функциональное определение должны быть сделаны в родительской оболочке.
Я думаю скрипт, который Вы пытаетесь запустить, не исполняемый файл. chmod a+x somescript.sh
добавит выполнить бит для пользователя, группы и другого (ugo) в тот файл. Первой строке файла также будет нужен #! строка наверху, как #!/bin/bash
.
ls -l somescript.sh
покажет Вам, rwx триплеты (читали/писали/выполняли) для файла. Этому будет нужен x, по крайней мере, в первом наборе, предполагая владение файлом.
export PATH=$PATH:/usr/local/bin
для добавления/usr/local/bin к $PATH затем действительно необходимо получить файл для замены переменных рабочей среды. Этот вопрос действительно, "Как я программно изменяю свои переменные среды в моей рабочей оболочке из сценария удара?" Сценарий . ./somescript.sh
выполняется очень хорошо - Вы используете точечную команду для источника в файле. tcsh использует "источник" для того же самого.
– A. R. Diederich
28.11.2013, 01:51
Выполнение этой команды в оболочке или добавление ее в конфигурационный файл оболочки добавит текущую директорию к переменной PATH. Переменная PATH - это список каталогов, в которых оболочка будет искать исполняемые файлы для выполнения при выдаче команды.
Это позволит вам запустить любой исполняемый файл в текущем каталоге без [1122438]./[12120]