2

Я хочу изменить рабочий каталог моего скрипта другим скриптом, который был включен.

Первый скрипт:

#!/bin/bash
pwd
source script2
pwd

Sedond скрипт:

cd ..
pwd

Результат следующий:

> ./script1
/home/sebi/testdir1/testdir2  # 1st script
/home/sebi/testdir1           # 2nd script
/home/sebi/testdir1           # 1st script

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

#!/bin/bash
while :
do
sleep 5  

cat /home/.../shelldata.txt >> /home/.../gmodshell #logging

((source /home/..../shelldata.txt) 2>&1) | \
sed -e "s/..shellRunner.sh..line../SH/" > \
/home/..../shellFeedback.txt

echo > /home/..../shelldata.txt

done

Общая цель - получить доступ к bash с помощью файлов, чтобы я мог записать команду в один файл, а через некоторое время я получил вывод в другом файле.

5 ответов5

5

Предполагая, что сценарии 1 и 2 находятся в одном каталоге, попробуйте создать сценарий 1:

#!/bin/bash
pwd
. ./script2
pwd

Помещение точки перед вызовом скрипта (я говорю о первой точке, а не о точке, являющейся частью пути к файлу скрипта, который вы хотите вызвать) говорит оболочке: «Выполните следующий скрипт в этом процессе, а не порождайте новый процесс для этого ".

Действия, выполняемые во втором скрипте (например, cd-ing или установка переменных), будут продолжаться и после завершения второго скрипта.

2

Из документации bash :

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

Поэтому вам следует избегать использования скобок при поиске файла с помощью . (точка) команда (как указано в этом ответе).

1

Это не относится к поиску сценария. Вы получите точно такой же результат с одним скриптом. Пытаться:

#!/bin/bash
pwd
cd ..
pwd

Причина в том, что запущенный скрипт выполняется в подоболочке. Когда скрипт возвращается, подоболочка закрывается, и вы возвращаетесь к своей исходной оболочке, где бы вы ни были в скрипте.

Если вы хотите, чтобы команда переместила вас в другой каталог, вы должны использовать вместо этого псевдоним или функцию bash:

function script1 () { cd ..; }
1

Нет смысла использовать команду source, если вы делаете это в подоболочке, как во втором сценарии:

((source /home/..../shelldata.txt) 2>&1) | \

Более того, shelldata.txt на самом деле является сценарием оболочки, поэтому его расширение .txt, хотя и не запрещено, сбивает с толку.

Наконец, было бы полезно, если бы вы рассказали, что содержит shelldata.txt, чтобы выяснить, как ответить на ваш вопрос.

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .