Bash의 명령 대체 선언 구문 - 이 두 가지 방법 중 어느 것이 더 좋습니까? [복사]

Bash의 명령 대체 선언 구문 - 이 두 가지 방법 중 어느 것이 더 좋습니까? [복사]

이것은 findbash 루프의 일부이며 어느 것이 구문적으로 더 정확한지, 그리고 그 이유는 무엇인지 알고 싶습니다.

filename="$(echo "$i" | cut -c5-)";
filename=`echo "$i" | cut -c5-`;

둘 다의 목적은 파일 이름을 얻는 것입니다.

답변1

이것Bash 매뉴얼에는 다음과 같은 내용이 나와 있습니다.:

POSIX $() 명령 대체 형식이 구현되었습니다(참조:명령 대체)이며 Bourne 쉘의 ``(이전 버전과의 호환성을 위해 구현됨)보다 우수합니다.

따라서 작성 중인 새로운 Bash 관련 항목에서는 So가 $(...)선호됩니다 . `...`백틱 대체는 잘 중첩되지 않으며(이스케이프해야 함) 약간 이상한 인용 동작이 있습니다. $(... $(...) ...)원하는 만큼 중첩 할 수 있습니다 . 문제 없습니다. 수동두 사람의 행동을 다음과 같이 묘사한다.:

이전 스타일의 백틱 대체 형식을 사용하는 경우 백슬래시는 "$", "`" 또는 "\"가 뒤에 오지 않는 한 문자 그대로의 의미를 유지합니다. 선행 백슬래시가 없는 첫 번째 백틱은 명령 대체를 종료합니다. $(command) 형식을 사용할 때 대괄호 안의 모든 문자는 명령을 구성합니다.

그것은보통 생각한다가장 좋은 방법은 엄격하게 요구되지 않는 경우를 포함하여 단어 분리 문제를 피하기 위해 모든 문자열 확장을 인용하는 것이므로 "$(...)"여기서도 더 나은 방법입니다.

마지막으로, 두 가지 관련 부분같은 양털 가장자리 페이지:

  • 이제 당신도 잊어야 할 때입니다 `...`. Expansion의 구문과 일치하지 않으며 진통제를 사용하지 않고 중첩하기가 어렵습니다. 대신 사용하십시오 $(...).
  • 제발 "따옴표를 사용하세요!" 문자열과 매개변수 확장을 보호하세요.분사. 올바르게 인용하지 않으면 분사가 아기를 잡아먹을 것입니다.

1 사실 이는 POSIX 스크립트에서도 sh모범 사례로 간주됩니다 . 주변에는 여전히 더 약한 껍질이 있지만, 마주치면 알게 될 것입니다.

답변2

VS 와 관련이 없는 코드의 `...`모범 사례에 대한 설명 $(...):

존재하다

filename="$(echo "$i" | cut -c5-)"

최소한 4가지 잠재적인 주의 사항이 있습니다(이를 악용할 동기가 없는 한 경미함).

  • echo백슬래시로 시작하거나 포함하는 echo값을 사용하면 (구현이나 환경에 따라) 문제가 발생할 수 있으므로 임의의 데이터를 사용할 수 없습니다 . 임의의 데이터로 작업할 때 가장 적합합니다(여기).$i-printfprintf '%s\n' "$i"
  • cut대부분의 텍스트 필터링 유틸리티는 파일 경로 처리에 적합하지 않습니다.모든그들의 입력 라인. 여기서는 처음 4자를 제거하고 싶습니다.모든line $i(개행은 파일 이름의 모든 문자만큼 유효합니다). 사용하는 것이 가장 좋습니다 (단 , 4자 미만의 문자를 포함하는 경우 filename=${i#????}도 고려해 볼 수 있음 ).$i
  • 명령 바꾸기( `...`또는 $(...)) 삭제모든명령 출력의 후행 개행 문자입니다. 따라서 $i줄 바꿈으로 끝나면 $filename. ${i#????}이 문제도 해결될 수 있습니다.
  • cut -c5-아니면 ${i#????}4개 삭제하세요수치. 일부 로케일에서는 한 문자가 두 개 이상의 문자로 구성될 수 있습니다.바이트. 이 점을 고려해 볼 수도 있습니다. (또한 참고하세요GNU는 cut멀티바이트 문자를 지원하지 않습니다.그러나 (동일)) cut -c.cut -b

관련 정보