`at` 명령으로 중괄호 확장을 수행할 수 있나요?

`at` 명령으로 중괄호 확장을 수행할 수 있나요?

에서는 bash명령을 실행하기 전에 괄호 확장이 셸 작업으로 수행됩니다.1이는 다음이 작동함을 의미합니다.
echo {1..10} >output | at -m now

출력은 다음과 같습니다 1 2 3 4 5 6 7 8 9 10.

작동하지 않는 것은 at명령이 실행될 것이라고 경고하는 명령에서 중괄호 확장을 시도하는 것입니다 /bin/sh. 제 경우에는 dash중괄호를 사용한 범위 확장에 대한 링크가 지원되지 않는 것 같습니다.

$ at - now
warning: commands will be executed using /bin/sh
at> echo {1..10} >output
at> <EOT>

dash그러면 (또는 Bourne 또는 연결하는 모든 쉘)에서 명령이 실행되어 /bin/sh출력이 생성됩니다 {1..10}.

이런 방식으로 명령을 사용할 때 중괄호 확장을 어떻게 수행합니까 at?


프롬프트에서 명령을 실행할 수 있는 것과 같이 답변으로 게시한 것 외에 다른 솔루션을 보고 싶습니다 bash. at프롬프트에서 실행되는 모든 단일 행 명령에 대한 스크립트를 작성하는 것은 필요한 것보다 더 많은 노력처럼 보입니다 at.

답변1

세 가지 간단한 다른 옵션이 있습니다. 하나는 약간 취약하며 쉘의 구현 세부 사항에 의존하고 다른 하나는 사용합니다.여기에 파일bash인라인 스크립트와 -c한 줄 전달을 위한 또 다른 스크립트를 제공하세요 .


가장 안정적이고 휴대 가능한 방법은여기 문서:

$ at now
warning: commands will be executed using /bin/sh
at> bash <<'EOF'
at> echo {1..5} >/tmp/output
at> EOF
at> <EOT>
job 24 at Mon Mar 23 20:41:20 2015
$ cat /tmp/output
1 2 3 4 5

<<word표준 입력으로 제공되고 bash까지 지속되는 here 문서를 선언하십시오 word. 파일을 인용하면 'EOF'쉘 확장이 적용되지 않으므로 먹지 $않고도 본문에 쓸 수 있습니다. dash스크립트는 EOF줄 시작 부분에 (또는 선택한 단어)를 제외한 모든 항목을 포함할 수 있습니다.

이것이 바로 제가 추천하는 접근 방식입니다. bash거의 사용했던 것처럼 작성할 수 있습니다. 시작 부분과 끝 부분에 한 줄만 추가하면 무슨 일이 일어나고 있는지 확인할 수 있습니다.


정말 한줄이면사용bash -c단일 명령을 전달하여 실행합니다.

$ at now
warning: commands will be executed using /bin/sh
at> bash -c 'echo {1..3} >/tmp/output'
at> <EOT>
job 25 at Mon Mar 23 20:50:03 2015
$ cat /tmp/output
1 2 3

명령에 따옴표를 사용하는 경우에는 약간 문제가 될 수 있습니다.


가장 까다로운 점은 atd일반적으로 작업이 표준 입력으로 쉘에 전송된다는 점입니다(그러나 이것이 필요하다고 생각하지는 않습니다). 쉘은 일반적으로 표준 입력을 한 줄씩 읽습니다(그러나 이 방식으로 실행할 필요는 없습니다).

실제로 이것이 구현된 경우라면 다른 셸에서 작업을 실행하는 불쾌한 트릭을 수행할 수 있습니다.

$ at now
warning: commands will be executed using /bin/sh
at> bash
at> echo {1..10} >/tmp/output
at> <EOT>
job 22 at Mon Mar 23 20:40:00 2015
$ cat /tmp/output
1 2 3 4 5 6 7 8 9 10

sh이는 첫 번째 줄을 읽고 실행한 bash다음 bash표준 입력의 나머지 부분을 명령으로 읽기 때문에 작동합니다 . 이것은 매우 취약하지만 작동할 때 가장 덜 침해적인 버전입니다.

dash이 점에서 그 자체는 많은 쉘보다 더 복잡하며 내부 버퍼를 채우는 것이 더 중요합니다. BusyBox 와 같은 다른 간단한 셸에는 sh라인 버퍼링 동작이 있는 경우가 많습니다.


마지막으로, 비록 당신은 결코필수의별도의 스크립트 파일을 사용하면 많은 경우 실제로 너무 영리하게 만드는 것보다 더 나은 옵션이 됩니다. 작업이 일회성이거나 프로그래밍 방식으로 생성되는 경우에는 모두 합리적인 선택이지만, 다른 경우에는 유지 관리 관점에서 독립 실행형 스크립트를 사용하는 것이 가치가 있을 수 있습니다.

나는 마지막 옵션과 함께 stdin을 사용하는 것을 정말로 권장하지 않지만, 그것은 귀여운 트릭이다.

답변2

bash지금까지 제가 찾은 유일한 해결책은 인터프리터 사용을 지정하는 스크립트(expandme.sh라고 부르겠습니다)를 작성하는 것입니다 .

#!/bin/bash
echo {1..10} >output

그런 다음 프롬프트에서 스크립트를 실행합니다 at.

$ at - now
warning: commands will be executed using /bin/sh
at> expandme.sh
at> <EOT>

이제 스크립트는 출력을 덤프하기 전에 우리를 dash/ Bourne추방에서 꺼내 확장을 수행합니다.

관련 정보