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

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

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

hello1-hello2-hello3-echo hello4

구함

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



답변

사용 $(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


답변

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

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

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


답변

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

$(command)

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

$((expr))

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

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

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

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


답변

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

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


답변

때때로 백틱 중첩은 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


답변