Редактировать скрипт во время его выполнения



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



Мне любопытно о конкретном случае сценария csh у меня есть, что пакет запускает кучу разных вкусов сборки и работает всю ночь. Если что-то происходит со мной в середине операции, я хотел бы войти и добавить дополнительные команды или прокомментировать неисполненные.



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



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

639   9  

9 ответов:

Скрипты не работают таким образом; выполняемая копия не зависит от исходного файла, который вы редактируете. При следующем запуске сценария он будет основан на последней сохраненной версии исходного файла.

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

[edit] см. также этот ответ, раздел 3 для решения проблем.

это тут влияет, по крайней мере баш в моем окружении, но в очень неприятным способом. Смотрите эти коды. Первый a.sh:

#!/bin/sh

echo "First echo"
read y

echo "$y"

echo "That's all."

b.sh:

#!/bin/sh

echo "First echo"
read y

echo "Inserted"

echo "$y"

# echo "That's all."

Do

$ cp a.sh run.sh
$ ./run.sh
$ # open another terminal
$ cp b.sh run.sh  # while 'read' is in effect
$ # Then type "hello."

в моем случае, выход всегда есть:

hello
hello
That's all.
That's all.

это непредсказуемо, поэтому опасно. Смотрите этот ответ, раздел 3 для обходные приемы.

[добавлено] точное поведение зависит от одной дополнительной новой строки, а также, возможно, от вашего вкуса Unix, файловой системы и т. д. Если вы просто хотите, чтобы увидеть некоторые влияет, просто добавьте "эхо из foo/bar", чтобы б.Ш. до и/или после того, как "линия чтения".

попробуйте это... создайте файл с именем "bash-is-odd.sh":

#!/bin/bash
echo "echo yes i do odd things" >> bash-is-odd.sh

Это показывает, что баш, действительно, интерпретирует сценарий "как вы идете". Действительно, редактирование длинного сценария имеет непредсказуемые результаты, вставляя случайные символы и т. д. Зачем? Поскольку bash считывает из последней позиции байта, поэтому редактирование смещает местоположение текущего считываемого символа.

Bash, одним словом, очень, очень небезопасно из-за этой "функции". svn и rsync при использовании с Bash скрипты особенно беспокоят, потому что по умолчанию они "сливают" результаты... редактирование на месте. rsync имеет режим, который исправляет это. svn и git этого не делают.

Я представляю решение. Создайте файл с именем "/bin / bashx":

#!/bin/bash
source ""

Теперь использовать #!/bin / bashx на ваших скриптах и всегда запускайте их с помощью "bashx" вместо bash. Это устраняет проблему - вы можете безопасно синхронизировать свои скрипты.

альтернативное (встроенное) решение предложенное / испытанное мимо @AF7:

{
   # your script
} 
exit $?

фигурные скобки защищают от изменений, а выход защищает от добавления. Конечно, нам всем было бы намного лучше, если бы bash пришел с опцией, такой как '-w' (весь файл) или что-то, что сделало это.

Разбейте свой скрипт на функции, и каждый раз, когда функция вызывается вами source его из отдельного файла. Затем вы можете редактировать файлы в любое время, и ваш запущенный скрипт подберет изменения в следующий раз, когда он будет получен.

foo() {
  source foo.sh
}
foo

у меня нет csh установлен, но

#!/bin/sh
echo Waiting...
sleep 60
echo Change didn't happen

запустите это, быстро отредактируйте последнюю строку для чтения

echo Change happened

выход

Waiting...
/home/dave/tmp/change.sh: 4: Syntax error: Unterminated quoted string

Hrmph.

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

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

Я слышу нет... но как насчет С некоторой косвенностью:

BatchRunner.sh

Command1.sh
Command2.sh

Command1.sh

runSomething

Command2.sh

runSomethingElse

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

или

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

хороший вопрос! Надеюсь, этот простой скрипт поможет

#!/bin/sh
echo "Waiting..."
echo "echo \"Success! Edits to a .sh while it executes do affect the executing script! I added this line to myself during execution\"  " >> 
sleep 5
echo "When I was run, this was the last line"

Кажется, что в linux изменения, внесенные в executing. sh, выполняются исполняющим скриптом, если вы можете ввести достаточно быстро!

Как правило, это необычно для редактирования сценария во время его работы. Все, что вам нужно сделать, это поставить на контроль вашей работы. Используйте операторы if/else для проверки условий. Если что-то не получается, то делай это, иначе делай то. Вот так и надо идти.

Comments

    Ничего не найдено.