Редактировать сценарий оболочки во время его работы

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

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

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

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

67 голосов | спросил ack 3 PM00000070000005231 2010, 19:49:52

10 ответов


0

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

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

ответил ford 3 PM00000070000002831 2010, 19:54:28
0

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

Это действительно влияет, по крайней мере, на bash в моем окружении, но очень неприятно . Смотрите эти коды. Сначала 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."

В моем случае вывод всегда такой:

привет
Привет
Это все.
Вот и все. 

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

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

ответил teika kazura 10 J0000006Europe/Moscow 2011, 11:44:57
0

Попробуйте это ... создайте файл с именем "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. Это решает проблему - вы можете безопасно перезаписать ваши скрипты.

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

{
   # your script
} 
exit $?

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

ответил Erik Aronesty 17 +04002013-10-17T19:28:53+04:00312013bEurope/MoscowThu, 17 Oct 2013 19:28:53 +0400 2013, 19:28:53
0

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

foo() {
  source foo.sh
}
foo
ответил glenn jackman 3 PM000000100000000331 2010, 22:59:03
0

У меня не установлен 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.

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

ответил dave4420 3 PM00000070000000831 2010, 19:57:08
0

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

ответил Ethan Shepherd 3 PM00000080000000031 2010, 20:10:00
0

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

#!/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, исполняются исполняющим скриптом, если вы можете набирать текст достаточно быстро!

ответил Will Turner 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 06 Sep 2018 07:24:38 +0300 2018, 07:24:38
0

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

BatchRunner.sh

Command1.sh
Command2.sh

Command1.sh

runSomething

Command2.sh

runSomethingElse

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

ИЛИ

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

ответил ack 3 PM00000080000002231 2010, 20:05:22
0

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

Я создал:

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

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

ответил Chris 9 52018vEurope/Moscow11bEurope/MoscowFri, 09 Nov 2018 17:04:57 +0300 2018, 17:04:57
0

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

ответил ghostdog74 3 PM00000070000003031 2010, 19:57:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132