Можете ли вы отредактировать сценарий оболочки во время его работы, чтобы изменения повлияли на работающий сценарий?
Мне любопытен конкретный случай csh-скрипта, который у меня есть, эта партия запускает кучу различных вариантов сборки и работает всю ночь. Если что-то случится со мной в середине операции, я бы хотел войти и добавить дополнительные команды или закомментировать невыполненные.
Если это невозможно, есть ли какая-нибудь оболочка или пакетный механизм, который позволил бы мне это сделать?
Конечно, я пробовал, но пройдут часы, прежде чем я увижу, сработало это или нет, и мне любопытно, что происходит или не происходит за кулисами.
Ответы:
Скрипты так не работают; исполняемая копия не зависит от исходного файла, который вы редактируете. В следующий раз, когда сценарий будет запущен, он будет основан на последней сохраненной версии исходного файла.
Было бы разумно разбить этот сценарий на несколько файлов и запускать их по отдельности. Это сократит время выполнения до отказа. (т. е. разделите пакет на один сценарий сборки, запускающий каждый отдельно, чтобы увидеть, какой из них вызывает проблемы).
источник
Это действительно влияет, по крайней мере, на удар в моем окружении, но очень неприятным образом . Смотрите эти коды. Первый
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."
Делать
$ cp a.sh run.sh $ ./run.sh $ # open another terminal $ cp b.sh run.sh # while 'read' is in effect $ # Then type "hello."
В моем случае вывод всегда:
(Конечно, это лучше автоматизировать, но приведенный выше пример можно прочитать.)
[править] Это непредсказуемо, поэтому опасно. Лучшим решением является , как описано здесь , поместить все в скобки и перед закрывающей скобкой, поставить «выход» . Внимательно прочтите связанный ответ, чтобы избежать ошибок.
[добавлено] Точное поведение зависит от одной дополнительной строки новой строки и, возможно, также от вашей разновидности Unix, файловой системы и т. д. Если вы просто хотите увидеть некоторые влияния, просто добавьте «echo foo / bar» в b.sh до и / или после строка "читать".
источник
b.sh
, добавив 10 строк echo foo / bar / baz. Суть ответов dave4220 и меня в том, что эффект предсказать непросто. (Кстати, существительное «привязанность» означает «любовь» =)Попробуйте это ... создайте файл с именем
bash-is-odd.sh
:#!/bin/bash echo "echo yes i do odd things" >> bash-is-odd.sh
Это демонстрирует, что bash действительно интерпретирует сценарий «по ходу». Действительно, редактирование долго работающего скрипта приводит к непредсказуемым результатам, вставке случайных символов и т. Д. Почему? Поскольку bash читает с последней позиции байта, редактирование смещает местоположение текущего читаемого символа.
Одним словом, Bash очень и очень небезопасен из-за этой «особенности». svn и
rsync
при использовании со сценариями bash вызывают особые проблемы, потому что по умолчанию они "объединяют" результаты ... редактирование на месте.rsync
есть режим, который это исправляет. svn и git не работают.Предлагаю решение. Создайте файл с именем
/bin/bashx
:#!/bin/bash source "$1"
Теперь с помощью
#!/bin/bashx
ваших скриптов и всегда запускать их сbashx
вместоbash
. Это решает проблему - вы можете безопасно использоватьrsync
свои скрипты.Альтернативное (линейное) решение, предложенное / протестированное @ AF7:
{ # your script } exit $?
Фигурные скобки защищают от редактирования, а exit защищает от добавлений. Конечно, нам всем было бы намного лучше, если бы в bash была опция, например
-w
(весь файл) или что-то подобное.источник
Разбейте свой скрипт на функции, и каждый раз, когда функция вызывается,
source
она вызывается из отдельного файла. Затем вы можете редактировать файлы в любое время, и ваш запущенный скрипт сохранит изменения в следующий раз, когда он будет получен.foo() { source foo.sh } foo
источник
Хороший вопрос! Надеюсь, этот простой сценарий поможет
#!/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, вводятся в действие исполняющимся скриптом, если вы можете набирать текст достаточно быстро!
источник
Интересное примечание: если вы используете скрипт Python, он не меняется. (Это, вероятно, очевидно для любого, кто понимает, как оболочка запускает сценарии Python, но считает, что это может быть полезным напоминанием для тех, кто ищет эту функциональность.)
Я создал:
#!/usr/bin/env python3 import time print('Starts') time.sleep(10) print('Finishes unchanged')
Затем в другой оболочке, пока она спит, отредактируйте последнюю строку. Когда это завершится, отобразится неизмененная строка, предположительно из-за того, что в ней запущен
.pyc
? То же самое происходит в Ubuntu и macOS.источник
У меня не установлен 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
Хмф.
Я предполагаю, что изменения в сценариях оболочки не вступят в силу, пока они не будут перезапущены.
источник
Change didn'ned
.Если это все в одном скрипте, то ничего не получится. Однако, если вы настроите его как скрипт драйвера, вызывающий субскрипты, то вы сможете изменить субскрипт до его вызова или перед повторным вызовом, если вы зацикливаетесь, и в этом случае я считаю, что эти изменения будет отражено в исполнении.
источник
Я не слышу ... но как насчет некоторой косвенности:
BatchRunner.sh
Command1.sh Command2.sh
Command1.sh
Command2.sh
Тогда вы сможете редактировать содержимое каждого командного файла до того, как BatchRunner доберется до него, верно?
ИЛИ
В более чистой версии BatchRunner обращался бы к одному файлу, где он последовательно запускал бы одну строку за раз. Тогда вы сможете редактировать этот второй файл во время работы первого, верно?
источник
Вместо этого используйте Zsh для своих сценариев.
AFAICT, Zsh не демонстрирует такого расстраивающего поведения.
источник
обычно редактировать скрипт во время его работы - редкость. Все, что вам нужно сделать, это поставить контроль над своими операциями. Используйте операторы if / else для проверки условий. Если что-то не получится, то сделайте это, иначе сделайте то. Это путь.
источник