Порядок инструкций в скрипте оболочки - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть этот простой сценарий оболочки:

#!/bin/sh

echo "alpha"

finish()
{
    echo "--------------------------------------------------------------"
}
trap finish EXIT

echo "bravo"

cd /non/existent/path
# cd /non/existent/path && gitk &

echo "charlie"

При запуске это дает следующий результат, как и ожидалось:

alpha
bravo
./test.sh: 13: cd: can't cd to /non/existent/path
charlie
--------------------------------------------------------------

Но тогда, если я раскомментирую строку, содержащую вызов gitk (т.е. строку 14), я получу следующий вывод:

alpha
bravo
./test.sh: 13: cd: can't cd to /non/existent/path
charlie
--------------------------------------------------------------
./test.sh: 14: cd: can't cd to /non/existent/path

Обратите внимание, что линия с тире больше не находится в конце. Есть идеи, почему это происходит?

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

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

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Поведение такое же, как и ожидалось, поскольку вы порождаете дочерний процесс через &.Если вы хотите, чтобы ваша функция прерывания выполнялась после добавления wait в конец вашего сценария:

#!/bin/sh

echo "alpha"

finish()
{
    echo "--------------------------------------------------------------"
}
trap finish EXIT

echo "bravo"

cd /non/existent/path
cd /non/existent/path && gitk &

echo "charlie"
wait

Она будет ожидать завершения всех дочерних процессов и затем завершаться (завершить прерывание вызова).Выход:

$ ./gautam.sh
alpha
bravo
./gautam.sh: line 13: cd: /non/existent/path: No such file or directory
charlie
./gautam.sh: line 14: cd: /non/existent/path: No such file or directory
--------------------------------------------------------------
1 голос
/ 11 апреля 2019

Как вы сказали, раскомментирование строки cd /non/existent/path && gitk & вызовет ее выполнение в фоновом режиме - команду cd и, после успешного выполнения, команду gitk.Поскольку команда cd не удалась, поскольку путь не существует, команда gitk не будет выполнена.Если вы хотите, чтобы он выполнялся независимо от предыдущей команды, разделите их на ; вместо &&

. Поскольку он выполняется в фоновом режиме, сценарии переходят на этап печати и только тогда, когда процесс ЦП переключается натот, который вы запустили в фоновом режиме, будет выполнен - ​​это может быть 10 строк после его запуска, или 5 строк, или 3 строки ... нет подходящего момента для его запуска, поэтому поведение, которое вы видите, нормальное.Удаление & приведет к его последовательному запуску в скрипте.

Чтобы запустить gitk в качестве фонового процесса и получить эту строку в конце, вы можете выполнить некоторые действия sleep после создания экземпляра gitk, но какэто всегда будет возвращать ошибку cd и gitk не будет работать из-за оператора &&.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...