큰따옴표 명령 대체는 좋은 습관입니다. 프로세스 대체( <()
and)는 동일한 가요 >()
?
큰따옴표는 명령 대체를 허용하지만 프로세스 대체는 허용하지 않는 것 같습니다.
$ echo <(printf "%s" hello)
/dev/fd/63
$ echo "<(printf "%s" hello)"
<(printf %s hello)
프로세스 대체 결과에 공백이 포함되거나 이런 일이 발생하지 않으면 어떻게 되나요?
감사해요.
답변1
간략하게 테스트한 바와 같이 참조 프로시저 대체는 이를 억제합니다.
$ echo <(echo 123)
/dev/fd/63
$ cat <(echo 123)
123
$ echo "<(echo 123)"
<(echo 123)
$ cat "<(echo 123)"
cat: '<(echo 123)': No such file or directory
질문하기 전에 이것을 시도하지 않았다는 것이 나에게는 이상하지만 이제는 그것이 작동하지 않는다는 것을 적어도 쉽게 확인할 수 있습니다.
echo "("
이는 동일한 토큰으로 다른 쉘 연산자를 참조할 때 발생하는 것과 다르지 않습니다. 이는 구문 오류가 아니며 echo "> /dev/sda"
문제를 일으키지 않습니다.
이것파일에 기록하다동작은 다음과 같습니다
파일 이름은 확장의 결과로 현재 명령에 인수로 전달됩니다.
단일 인수로 공백의 유무는 중요하지 않으며 토큰화는 관련이 없으며 수행되지 않습니다. 일부 플랫폼에서는 생성된 경로에 공백이 나타날 수 있지만 이는 효과가 없습니다.
답변2
Bash에서 문자열을 묶을 때큰따옴표, 다음 특수 문자 중 하나 이상이 포함되지 않는 한 리터럴로 해석됩니다.
$ ` \ ! * @
<(command_list)
프로세스 대체 구문은 큰따옴표 안에 해석할 수 없습니다. 텍스트 이외의 것으로 해석되는 문자는 포함되지 않습니다. 큰따옴표는 구문 해석을 허용하지 않으므로 프로세스 대체를 방지하는 데 필요합니다.
명령 대체 구문은 다음과 같습니다.
$(command)
# or
`command`
두 가지 모두 $
큰따옴표(또는 역따옴표) 안의 특수 문자로 시작하며, 아시다시피 큰따옴표는 명령 대체를 억제하지 않습니다.
이는 큰따옴표가 특정 동작을 억제할지 여부를 예측하려는 경우 고려해야 할 첫 번째 규칙입니다. 구문에 이러한 6개 문자 중 하나가 포함되어 있지 않으면 큰따옴표로 이를 억제해야 합니다(중괄호 확장, 물결표 확장, 프로세스 대체, 단어 분리기 사용, 이러한 문자는 큰따옴표 안에 나타날 수 없음).물론 이러한 6개 문자 중 하나와 관련된 모든 구문이 큰따옴표 안에 표시되는 것은 아니지만 고려해야 할 첫 번째 규칙입니다. 이 답변과 규칙은 모든 상황을 직면하기 전에 예측하고 기억할 수 있도록 고안되었습니다. 큰따옴표 안의 구문을 해석할 수 없으면 이 동작이 발생하지 않습니다.