Подтвердить что ты не робот

Измените оболочку script, пока она работает

Можете ли вы отредактировать оболочку script во время ее работы и повлиять на работу script?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

[edit] См. также этот ответ, раздел 3 для обходных путей.

Он действует, по крайней мере bash в моей среде, но очень неприятный. См. Эти коды. Первый a.sh:

#!/bin/sh

echo "First echo"
read y

echo "$y"

echo "That all."

b.sh:

#!/bin/sh

echo "First echo"
read y

echo "Inserted"

echo "$y"

# echo "That 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 all.
That all.

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

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

Ответ 3

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

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

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

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

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

#!/bin/bash
source "$1"

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

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

{
   # your script
} 
exit $?

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

Ответ 4

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

foo() {
  source foo.sh
}
foo

Ответ 5

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

#!/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\"  " >> ${0}
sleep 5
echo "When I was run, this was the last line"

Похоже, что в Linux изменения, внесенные в исполняемый файл .sh, выполняются исполняющим скриптом, если вы можете печатать достаточно быстро!

Ответ 6

У меня нет 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.

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

Ответ 7

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

Ответ 8

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

Я создал:

#!/usr/bin/env python3
import time
print('Starts')
time.sleep(10)
print('Finishes unchanged')

Затем в другой оболочке, пока она спит, отредактируйте последнюю строку. Когда это завершается, он отображает неизмененную строку, предположительно потому, что он запускает .pyc? То же самое происходит в Ubuntu и macOS.

Ответ 9

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

BatchRunner.sh

Command1.sh
Command2.sh

Command1.sh

runSomething

Command2.sh

runSomethingElse

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

ИЛИ

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

Ответ 10

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