명령 접두사 도구를 사용하여 일괄 작업을 보다 쉽게 ​​지정할 수 있는 방법은 무엇입니까?

명령 접두사 도구를 사용하여 일괄 작업을 보다 쉽게 ​​지정할 수 있는 방법은 무엇입니까?

batch데몬과 함께 제공되는 도구는 atd원칙적으로 시스템 활용도가 특정 수준(기본적으로 1.5) 아래로 떨어질 때만 명령을 실행하는 데 유용합니다. 그러나 이를 사용하는 것은 at현대 표준에 따라 매우 보기 흉합니다. 에서 실행할 수 있는 스크립트를 제공하거나 /bin/sh완료, 색상 코딩 등 없이 기본 프롬프트에 대화형으로 명령을 입력해야 합니다.

정말 좋은 점은 nice명령 앞에 배치하여 배치 대기열에 추가할 수 있는 명령 접두사 도구가 될 것입니다( at내 질문의 초점은 아니지만 비슷한 유틸리티가 유용할 것입니다). . 예를 들어 다음과 같이 작동할 수 있습니다.

my-batchifying-command python some_longrunning_computational_script.py

그런 것이 존재하나요? 그렇지 않다면 어떻게 만들어졌나요? 나는 이것을 zsh메인 쉘에 사용하지만 bash대답은 똑같이 잘 작동하고 더 넓은 적용 범위를 가질 수 있습니다.

답변1

zsh간단한 명령 의 경우 :

my-batch() {print -r -- ${(qq)@} | batch}

my-batch python some_longrunning_computational_script.sh

그렇게 할 것이다.

루프나 리디렉션과 같이 더 복잡한 것이 필요한 경우 다음을 수행할 수 있습니다.

my-batch eval 'for i in ...; done'

my-batch eval 'echo test > /some/file'

하지만 구문 sh이 아니라 사용법을 기억하세요 zsh.

이를 방지하려면 eval다음 트릭을 사용할 수 있습니다.

alias my-batch=':||'
preexec()
  if [[ $1 = my-batch\ * ]]; then
    print -r -- "${1#my-batch }" | batch
  fi

이번에도 구문을 사용해야 합니다 sh.

만 가능하니 참고해주세요하나명령(실제로는 파이프)입니다. 중괄호가 여러 개 필요한 경우 중괄호를 사용하세요.

my-batch { ls > /tmp/a; date > /tmp/b; }

위의 아이디어는 my-batch명령이 아무 작업도 수행하지 않고 명령의 인수도 평가하지 않는다는 것입니다(예: my-batch echo $(date)로 확장됨) :|| echo $(date). preexec작업을 수행하기 위해 명령줄이 승인될 때마다 명령이 실행됩니다.

의 경우 preexec전체 $1명령줄은 변경되지 않습니다. 로 시작하는지 확인 "my-batch "하고 삭제한 후 나머지는 으로 보냅니다 batch.

my-batch이것이 줄의 시작 부분에 있어야 하는 이유를 설명합니다 . 예를 들어 작동하지 않으며 실제로는 로 해석되기 때문에 cmd && my-batch ...그런 작업을 수행할 수 없습니다 .my-batch foo || bar:|| foo || bar

관련 정보