할당 한 같은 줄에 변수를 내 보내지 않는 이유는 무엇입니까?


44

에서 이전 명령의 마지막 인자는 무엇인가?

shellcheck는 변수를 할당 한 같은 줄에 변수를 내 보내지 말라고 지시합니다.

왜 궁금해?

같은 조언을 적용 할 수 있는가 alias, declare, export, local, readonly,와 typeset?




9
해당 쉘 체크 규칙은 SC2155입니다. shellcheck wiki 에는 꽤 좋은 문서가 있습니다 .
phunehehe

3
또한 일부 오래된 쉘은 export함께 수락하지 않습니다 . 보 Bourne 쉘은 , 예를 들어, 에러 "2 식별자 아니다 = foo에의"을 출력한다.
Dennis Williamson

답변:


54

문제는 배쉬의 모든 명령은 하나의 종료 코드를 가지고 있다는 것입니다. export foo="$(false)"종료 코드 false가 삭제 되면 간단하게 폐기됩니다. 대신에

foo="$(false)"
export foo

실패한 첫 번째 명령은 예를 들어 errexit설정에 의해 수행 될 수 있습니다 .

export foo='bar'물론 문자열 리터럴을 선언하고 할당하면 이 문제가 발생하지 않습니다. 그러나 변화는 소프트웨어 개발에서 유일한 상수이며, 그러한 진술을 분리하여 미래에 대비할 수있는 좋은 방법입니다.

언급 한 할당 특정 명령 외에도 단일 할당에 여러 개의 명령 (예 :)이 foo="$(false)$(true)"있습니다. 보기 pipefailman bash또 다른 같은 함정.

기억해야 할 또 다른 사항은 선언 및 할당 순서가 때때로 관련이 있다는 것입니다. 예를 들어, 변수 지정 하기 전에 선언 해야 합니다. (불행히도 변수 를 처음 할당하기 전에 선언 할 수 없습니다 .)local readonly


따라서 리터럴에서 변수를 설정하고 버릴 종료 코드가 없으면 한 줄에서 모두 수행하는 데 아무런 문제가 없습니다.
Monty Harder

1
이 쉘 체크 오류에 관한 한, 아닙니다. 그러나 지금 삭제 된 답변이 그들 사이에 절반의 권리를 얻음에 따라 Bourne 쉘은에 대한 할당 구문을 지원하지 않았 export으므로 몇 년 동안 통역사가 Bourne 쉘이 될 가능성이 있다면 이것을 수행하는 것에 대한 지혜가있었습니다.
JdeBP

@JdeBP, Bourne 쉘이 종료 상태를 잃는 foo=$(cmd) export foo것과 같은 경고가 cmd있지만 (그러나 실패하면 쉘이 종료되게 함 set -e) 지원했습니다.
Stéphane Chazelas

그것은 나의 첫 문장으로 덮여있었습니다.
JdeBP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.