나는 최근에 배웠다보다, 그러나 상대적으로 복잡한 명령을 사용하여 작동시키는 데 어려움을 겪었습니다.
watch
예를 들어, 다음 명령이 3초마다 실행되도록 요구하고 싶습니다 * :zsh
for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done
보시다시피 위 줄에는 작은따옴표, 큰따옴표 및 기타 특수 문자가 포함되어 있습니다.
그래서 나는 다음을 시도한다:
watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"
하지만 나는 다음과 같은 결과를 얻습니다.
!@#$#에서 x와 일치하는 항목을 찾을 수 없습니다 .... 완료
나는 성공하지 못한 채 다른 조합을 시도했습니다. 이는 다음 시도 중 하나입니다.
watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"
이로 인해 유사한 오류가 발생할 수도 있습니다.
이 작업을 수행하는 방법에 대한 아이디어가 있습니까?
* 적용 가능한 솔루션에도 관심이 있습니다bash
답변1
일반 팁: 두 가지 수준의 중첩이 있는 경우 내부 명령에 작은따옴표를 사용하지 말고 외부 명령 주위에 작은따옴표를 사용하십시오.
`…`
추가 팁: 코드를 실행하려면 백틱을 사용하지 말고 대신 백틱을 사용하세요 $(…)
. 중첩된 따옴표의 경우 달러 괄호는 거의 DWIM("내 뜻대로 실행")입니다. 백틱에는 신비한 쉘 종속 규칙이 있습니다.
watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
작은따옴표 명령 내에서 작은따옴표를 사용해야 하는 경우 를 사용할 수 있습니다 '\''
. 기술적으로는 작은따옴표 문자열을 끝내고 Literal을 추가하도록 구성되었지만 이 네 문자를 작은따옴표 안에 있는 작은따옴표로 묶는 방법으로 생각하십시오. 작은따옴표를 사용하고 작은따옴표로 묶인 새 문자열을 시작합니다(여전히 현재 단어에 연결되어 있음).
더 복잡한 경우에는 따옴표를 신중하게 계산하거나 임시 변수를 정의하세요.
cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'
이 답변은 zsh에만 국한되지 않습니다. Zsh는 여기서 중요한 것을 가져오지 않습니다. 명령 대체에는 큰따옴표가 필요하지 않기 때문에 일부 인용을 저장할 수 있으며 때로는 인용 요구 사항을 줄이기 위해 외부 명령 대신 내장 명령을 사용할 수 있지만 근본적인 문제는 다른 셸과 동일합니다.
아, 그리고 zsh가 아닌 watch
zsh에서 명령을 실행 한다는 점에 유의하세요 sh
. zsh에서 명령을 실행하려면 다음을 실행해야 합니다.
watch -n 3 -x zsh -c "$cmd"
데비안/우분투에서, 그리고
export cmd
watch -n 3 'exec zsh -c "$cmd"'
(더 많은 것을 인용하세요!) 다른 곳.