Bash 백틱을 올바르게 중첩하는 방법


95

백래시를 놓쳤거나 백 래싱이 너무 많은 프로그래머 인용 반복에서 작동하지 않는 것 같습니다.

$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"

hello1-hello2-hello3-echo hello4

구함

hello1-hello2-hello3-hello4-hello5-hello6-...

질문은 아마도 "Bash 백틱을 재귀 적으로 사용하는 방법"을 읽어야합니다. 그것은 Google 직원을 도울 것입니다.
Joey Adams

당신이하려는 것이 무엇입니까.? 이것은 전혀 의미가 없습니다.
ghostdog74 2010

1
@joey, 제목, URE 환영을 변경 : D
Stormenet

1
죄송합니다. "Bash에서 백틱을 중첩하려면 어떻게해야합니까?"라고 읽어야합니다. . 재귀와 중첩이 섞여 있습니다.
Joey Adams

deprecated따라서 백틱이 사용 $(cmd)됩니다.
Timo

답변:


149

사용 $(commands)하는 대신 :

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

$(commands) 백틱과 동일한 작업을 수행하지만 중첩 할 수 있습니다.

Bash 범위 확장에 관심이있을 수도 있습니다.

echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10

{1..10}과 같은 +1. 배열로 제한 하시겠습니까? ZSH는 "$ {$ (date) [2,4]}"를 사용할 수 있습니다. "echo $ {echo hello1-$ (echo hello2) [1]}"가 아닌 이유는 무엇입니까?
hhh apr

35

백틱 사용을 고집하면 다음과 같이 할 수 있습니다.

$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"

백 슬래시 \\ \\\\ \\\\\\\\를 2 배씩 넣어야합니다. 아주보기 흉해서 $(commands)다른 제안대로 사용 하세요.


11

명령을 평가할 때마다 다음을 사용하십시오 command substitution.

$(command)

산술 표현식을 평가하려면 언제든지 다음을 사용하십시오 expression substitution.

$((expr))

다음과 같이 중첩 할 수 있습니다.

다음과 같은 표현식을 평가할 수있는 것보다 file1.txt가 30 줄이고 file2.txt가 10 줄이라고 가정 해 보겠습니다.

$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))

20 (두 파일 사이의 줄 수 차이)을 출력합니다.


10

중첩에 훨씬 더 친숙한 bash의 $(cmd) 명령 대체 구문 을 사용하면 훨씬 쉽습니다 .

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

5
이것은 bash로 제한되지 않습니다 . 실제 Bourne 셸 (예 : heirloom.sourceforge.net )은 아니지만 POSIX 1003.1 ( "POSIX 셸")과 대부분의 Bourne 파생 셸 ( ksh , ash , dash , bash , zsh 등) 을 준수하는 모든 셸에서 사용할 수 있습니다 . /sh.html ).
Chris Johnsen

와우,이 답변의 타임 스탬프는 @joey_adams 답변의 타임 스탬프와 동일합니다! 그것의 동시성은 가장 문자적인 의미입니다. :) 여기도 Upvoting (:
drevicko

0

때때로 백틱 중첩은 xargs및 파이프 로 대체 될 수 있습니다.

$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4

이 솔루션의 단점은 다음과 같습니다.

  • 모든 인수는 역순 (4 → 1)으로 제공되어야합니다.
  • 모든 인수는 공백으로 구분됩니다 (로 해결 가능 tr).

    $ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-'
    hello1-hello2-hello3-hello4
    


실제 사용 사례를 보여 드리겠습니다.

다음 명령은 bash에서는 작동하지만 tcsh에서는 작동하지 않습니다 (백틱 중첩은 tcsh에서 잘 처리되지 않음).

$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``

그들은 다음으로 대체 될 수 있습니다.

$ which bash | xargs dirname | xargs ls
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.