사용자가 Ctrl-C를 사용하여 명령을 종료한 후에 명령을 실행할 수 있습니까?

사용자가 Ctrl-C를 사용하여 명령을 종료한 후에 명령을 실행할 수 있습니까?

그래서 내 위치에서는 빌드에 대한 공유 별칭 세트를 사용합니다. 그것은 마치 ...

alias 'build'='cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; cd -'

make 명령을 수행하는 데 약 3분이 걸리고 일반적으로 뭔가를 놓쳤다는 것을 깨닫고 Ctrl-C를 누르고 즉시 빌드를 다시 실행하기 때문에 이는 매우 짜증나는 일입니다. 이로 인해 내가 좋아하지 않는 디렉토리에 들어가게 되었고 다시 들어가야 하는 고통스러운 경로가 생겼습니다.

내가 정말로 원하는 것은...

alias 'betterbuild'='pushd .; build; even-if-the-user-cancelled popd'

이를 수행할 수 있는 방법이 있습니까?

답변1

글쎄요, 별칭은 실제로 이와 같은 복잡한 작업을 수행하도록 의도된 것이 아니기 때문에 스크립트로 만들라고 말하고 싶습니다.더 복잡하거나 오래 실행되는 작업에 이상적입니다. 별칭은 기본적으로 기본 인수를 기본적으로 지원하지 않는 명령에 기본 인수를 제공하는 것과 같이 하나의 명령을 다른 명령에 매핑하는 것을 의미합니다.

그러나 귀하가 이 별칭을 유지하고 싶다고 의견을 남겼으므로 별칭 범위 내에서 원하는 작업을 수행하는 방법을 알아내야 합니다.

그러면 자연스러운 선택은 별칭 내에서 하위 쉘을 시작하는 것입니다. 예를 들어:

~$ alias xyz1='( cd ~/tmp; sleep 10; cd ~ )'
~$ alias xyz2='cd ~/tmp; sleep 10; cd ~'
~$ xyz2
^C
~/tmp$ cd
~$ xyz1
^C
~$

CtrlC이는 별칭이 정상적으로 실행을 완료하거나 + 를 통해 중단될 때 종료되는 서브셸 내의 작업 디렉터리만 변경합니다.

답변2

서브쉘을 사용할 수도 있습니다.

alias build='( cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; )'

위의 예에서 cd $BUILD_ROOT서브쉘의 현재 작업 디렉토리는 변경되지만 별칭을 호출하는 대화형 쉘은 변경되지 않습니다. 일반적인 경우에는 서브쉘과 종료 트랩을 사용할 수 있습니다.

alias build='( cleanup() { do; cleanup; }; trap cleanup EXIT; cd $BUILD_ROOT; m; cp ...; cp...; deploy; deploy; deploy; )'

그러나 스크립트 사용을 다시 고려하십시오. 위의 예는 스크립트에서 훨씬 더 깔끔하게 보일 것입니다. 스크립트는 자체 쉘 인스턴스 내에서 해석됩니다. 스크립트에는 하위 쉘 구문이 필요하지 않습니다.

귀하는 귀하의 의견에서 스크립트가 귀하의 별칭에 따라 다르다고 언급했습니다. 이는 스크립트를 실행하는 대신 스크립트를 받고 있음을 의미하며 이는 일반적으로 나쁜 습관입니다. 또한 일부 별칭은 별칭에 따라 다르다고 언급하셨습니다. 별칭에 스크립트를 사용할 수 있습니다.

관련 정보