다른 명령에 작은 따옴표와 큰 따옴표가 포함 된 명령 줄 바꿈


10

최근에 watch 에 대해 배웠지 만 비교적 정교한 명령으로 작동하는 데 문제가 있습니다.

예를 들어, 3 초마다 watch다음 명령을 실행하고 싶습니다 * :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

답변:


16

일반적인 팁 : 두 수준의 중첩이있는 경우 내부 명령에 작은 따옴표를 사용하지 말고 외부 명령에 작은 따옴표를 사용하십시오.

추가 팁 : `…` 코드를 실행하기 위해 백틱을 사용하지 말고 대신 사용 $(…)하십시오. 달러 괄호는 중첩 된 따옴표와 관련하여 DWIM ( '무엇을 의미합니까?')과 거의 비슷합니다. 역 따옴표에는 비전적이고 쉘 종속 규칙이 있습니다.

watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'

작은 따옴표로 묶은 명령 안에 작은 따옴표가 필요하면을 사용할 수 있습니다 '\''. 기술적으로 말해서 작은 따옴표로 묶은 문자열을 끝내고 리터럴 작은 따옴표를 추가하고 새로운 작은 따옴표로 묶인 문자열을 시작하는 것으로 기술되지만,이 네 문자는 작은 따옴표 안에 작은 따옴표를 인용하는 방법으로 생각하십시오. 통용어).

더 복잡한 경우에는 따옴표를 힘들게 세거나 임시 변수를 정의하십시오.

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명령을 실행 한다는 점에 유의하십시오 sh. zsh에서 명령을 실행하려면 다음을 실행해야합니다.

watch -n 3 -x zsh -c "$cmd"

데비안 / 우분투에서

export cmd
watch -n 3 'exec zsh -c "$cmd"'

다른 곳에서 (더 많은 인용!).


감사합니다 @Gilles. 매우 도움이되었습니다. 흥미롭게 도 내 컴퓨터 watch에는 옵션 이 없습니다 . 온라인에서 조회 한 결과 해당 매뉴얼 페이지를 찾지 못했습니다. 이 옵션들은 무엇을합니까? -x-c
Amelio Vazquez-Reina

1
@intrpc -xwatch셸을 통해 명령을 전달하지 않도록 지시 합니다. 방금 표시되지 않았지만 데비안 / 우분투에만 해당한다는 것을 알았습니다. 이 ( -c가)에 전달 zsh되지 않았습니다 watch.
Gilles 'SO- 악마 그만해

@Gilles -xand -exec옵션은 모두 watch젠투에 존재 하므로 데비안 고유의 것은 아닙니다. 어쩌면 다른 버전의 watch? 광산은 procps 패키지 에서 제공 됩니다.
rozcietrzewiacz

1
@rozcietrzewiacz 도 데비안 watch에서 나왔습니다 procps. 공식 소스는 없습니다 --exec. 데비안 패키지 (그리고 우분투를 포함한 파생물)는 데비안 특정 패치에 옵션을 추가합니다 ( watch_exec_beep.patch; 버그 # 410967 의“Mortys watch exec 패치” ). 젠투도 비슷한 패치를 채택했을 것입니다.
Gilles 'SO- 악마 그만해'10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.