태그 보관물: csh

csh

실행 중 셸 스크립트 편집 쉘 스크립트를 편집하고 변경 사항이 실행중인 스크립트에

실행중인 쉘 스크립트를 편집하고 변경 사항이 실행중인 스크립트에 영향을 미치도록 할 수 있습니까?

csh 스크립트의 특정 사례에 대해 궁금합니다. 배치가 여러 가지 빌드 버전을 실행하고 밤새도록 실행됩니다. 작업 중에 뭔가가 발생하면 들어가서 추가 명령을 추가하거나 실행되지 않은 명령을 주석 처리하고 싶습니다.

가능하지 않은 경우이를 수행 할 수있는 쉘 또는 배치 메커니즘이 있습니까?

물론 시도해 보았지만 효과가 있는지 확인하기까지 몇 시간이 걸릴 것이며, 뒤에서 무슨 일이 일어나고 있는지 아닌지 궁금합니다.



답변

스크립트는 그렇게 작동하지 않습니다. 실행중인 사본은 편집중인 소스 파일과 독립적입니다. 다음에 스크립트가 실행될 때 가장 최근에 저장된 소스 파일 버전을 기반으로합니다.

이 스크립트를 여러 파일로 나누어 개별적으로 실행하는 것이 좋습니다. 이렇게하면 실행 시간이 실패 할 수 있습니다. (즉, 배치를 하나의 빌드 플레이버 스크립트로 분할하고 각 스크립트를 개별적으로 실행하여 문제를 일으키는 원인을 확인합니다).


답변

그것은 않습니다 내 환경에서 최소한의 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."

하다

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

제 경우 출력은 항상 다음과 같습니다.

여보세요
여보세요
그게 다야.
그게 다야.

(물론 자동화하는 것이 훨씬 낫지 만 위의 예는 읽을 수 있습니다.)

이것은 예측할 수 없으므로 위험합니다. 가장 좋은 해결 방법은 , 여기에 설명 된 바와 같이 중괄호의 모든을 넣어 닫는 중괄호 전에, “exit”를 넣어 . 함정을 피하기 위해 연결된 답변을 잘 읽으십시오 .

[추가됨] 정확한 동작은 하나의 추가 줄 바꿈에 따라 달라지며 아마도 Unix 버전, 파일 시스템 등에 따라 달라집니다. 단순히 영향을보고 싶다면 b.sh 앞뒤에 “echo foo / bar”를 추가하면됩니다. “읽기”줄.


답변

이것을 시도하십시오 …라는 파일을 만드십시오 bash-is-odd.sh:

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

이것은 bash가 실제로 “당신이가는대로”스크립트를 해석한다는 것을 보여줍니다. 실제로 장기간 실행되는 스크립트를 편집하면 임의의 문자를 삽입하는 등 예측할 수없는 결과가 발생합니다. 이유는 무엇입니까? bash는 마지막 바이트 위치에서 읽기 때문에 편집하면 현재 읽고있는 문자의 위치가 이동합니다.

Bash는 한마디로이 “기능”때문에 매우 안전하지 않습니다. svn 및 rsyncbash 스크립트와 함께 사용하면 기본적으로 결과를 “병합”하기 때문에 특히 문제가 발생합니다. 제자리에서 편집합니다. rsync이를 수정하는 모드가 있습니다. svn과 git은 그렇지 않습니다.

해결책을 제시합니다. 다음과 같은 파일을 만듭니다 /bin/bashx.

#!/bin/bash
source "$1"

이제 #!/bin/bashx스크립트에서 사용하고 항상 bashx대신 bash. 이렇게하면 문제가 해결 rsync됩니다. 스크립트를 안전하게 사용할 수 있습니다.

@ AF7에서 제안 / 테스트 한 대체 (인라인) 솔루션 :

{
   # your script
}
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

음.

쉘 스크립트에 대한 편집은 다시 실행될 때까지 적용되지 않는 것 같습니다.