"내보내기 var = value"를 사용할 수없는 곳은 어디입니까?


31

아마 1990 년대 중반 유즈넷에서 (!)

export var=value

Bashism이며 이식 가능한 표현은

var=value
export var

나는 이것을 몇 년 동안 옹호 해 왔지만 최근 누군가 누군가 그것에 대해 이의를 제기했다.

인터넷 검색은 "export: command not found"누군가가 실제로이 문제가있는 경우를 제기하지 않는 것 같습니다. 그래서 그것이 진짜 라하더라도 매우 일반적이지 않은 것 같습니다.

(내가 얻은 히트는 구두점을 복사 / 붙여 넣기하여 초보자 'export: command not found또는 그와 export함께 사용하거나 sudo초보자 csh사용자가 Bourne 쉘 구문을 사용하려고하는 초보자 인 것 같습니다.)

확실히 OS X 및 shis를 포함한 다양한 Linux 배포판에서 작동한다고 말할 수 있습니다 dash.

sh$ export var=value
sh$ echo "$var"
value
sh$ sh -c 'echo "$var"'  # see that it really is exported
value

오늘날의 세상에서 사용하기에 안전하다고 말하는 export var=value것이 안전합니까?

결과가 무엇인지 이해하고 싶습니다. v7 "Bourne classic"으로 이식 할 수 없다면, 그저 사소한 일이 아닙니다. 쉘이이 구문에 실제로 대처할 수없는 생산 시스템이 있다면, 그것은 유용 할 것입니다.


2
고마워 내가 왜 그렇게 자주 쓸모가 없다고 생각하는지 이해했다 : var = value; export var
Thorsten Staerk

2
여전히 몇 개의 솔라리스 박스가 작동하고 있으며, 표준 툴에서는 매우 소박합니다. 스펙트럼의 다른 쪽 끝에서 busybox자체 최소 쉘 이 제공되지 않습니까? (저는 두 번째 방법 중 하나를 시도해 볼 수 없습니다.)
Ulrich Schwarz

Ulrich에게 감사합니다. Solaris가이 긴 구문이 여전히 존재하는 이유 일 수 있습니다.
Thorsten Staerk

답변:


20
export foo=bar

Bourne 쉘 ( shash / bash / ksh / yash / zsh와 같은 최신 구현 에서 파생 된 70 년대의 오래된 쉘)은 지원하지 않았습니다 . 에 의해 소개되었습니다 ksh.

Bourne 쉘에서 다음을 수행합니다.

foo=bar export foo

또는:

foo=bar; export foo

또는 함께 set -k:

export foo foo=bar

이제, 다음의 동작 :

export foo=bar

쉘마다 다릅니다.

문제는 할당과 간단한 명령 인수가 구문 분석되고 다르게 해석된다는 것입니다.

foo=bar위 의 내용은 일부 쉘에서는 명령 인수로, 다른 쉘에서는 할당 (때로는)으로 해석됩니다.

예를 들어

a='b c'
export d=$a

다음과 같이 해석됩니다.

'export' 'd=b' 'c'

일부 쉘 ( ash, 이전 버전 zsh(에뮬레이션) yash) 및 :

'export' 'd=b c'

다른 사람 ( bash, ksh).

동안

export \d=$a

또는

var=d
export $var=$a

'export' 'd=b' 'c'백 슬래시 또는 달러 기호는 해당 인수를 대입으로 간주하도록 지원하는 쉘을 중지하므로 모든 쉘에서 (와 같이 ) 동일하게 해석 됩니다.

경우 export자체 인용하거나 (심지어 부분) 일부 확장의 결과, 쉘에 따라, 또한 특별한 치료를받지 않으 것입니다.

이에 대한 자세한 내용은 " 로컬 변수 할당에 따옴표가 필요합니까? "를 참조하십시오.

Bourne 구문은 다음과 같습니다.

d=$a; export d

모호함이없는 모든 쉘에서 동일하게 해석됩니다 ( d=$a export dBourne 쉘 및 POSIX 호환 쉘에서도 작동하지만 에뮬레이션 zsh하지 않는 한 최신 버전에서는 작동 하지 않음 sh).

그것보다 훨씬 나빠질 수 있습니다. 예를 들어 ,bash 배열이 관련된시기 에 대한 최근 토론을 참조하십시오 .

(IMO, 그 기능 을 소개하는 것은 실수였습니다 ).


나는 foo=bar export foo항상 거기에서 보았 듯이 세미콜론이 필요하지 않다는 것에 놀랐다 . 수출이 내장되어 있다는 것을 알고 있지만 왜 foo=bar; foo=baz export foo; echo $foo다르게 작동 foo=bar; foo=baz /bin/cat /dev/null; echo $foo합니까?
jrw32982는 Monica

3
@ jrw32982는 내장되어 있기 때문입니다. 당신은 여전히 현대 POSIX 껍질에 있지만 얻을 에만 특수 내장 명령export 입니다.
Stéphane Chazelas

이 설명하지만 declare,하지 export, 나는 보안에 대한 염려가에서 토론 읽고 그 사람이 추천 StéphaneChazelas이 bash.bugs 제공하는 링크를 .
John1024

좋은 답변입니다! 그러나 도착하는 데 시간이 오래 걸렸습니다. d=$a export d모호하지 않은 모든 껍질에서 동일하게 해석됩니다. ;-)
conny

@conny, d=$a export d에서 더 이상 작동하지 않으므로 zsh답변을 업데이트했습니다. 편집을 참조하십시오.
Stéphane Chazelas

28

bashism이 아니라 POSIX 호환 구문입니다. 그것은 실제로 오래 전에 kshism으로 시작했으며 나중에 거의 모든 Bourne 구문 기반 쉘에 의해 채택되었습니다. 유일하게 악명 높은 예외는 /bin/sh레거시 Bourne 쉘 구문을 고수하는 Solaris 10 및 그 이전 버전입니다. 다행스럽게도 Solaris 11은 POSIX 호환 쉘을로 사용 /bin/sh합니다.

그건 그렇고, export기존 Bourne 쉘에 이미 내장 된 명령이므로 인터넷 검색 export: command not found이 잘못되었습니다.

다음은 export영향과 결합 된 기존 Bourne 셸 동작 입니다.

$ export var=22
var=22: is not an identifier

그리운 사람들 을 위해이 원본 Bourne 쉘소스 코드를 사용할 수 있으며 대부분의 Unix 및 Linux 배포판에 맞게 컴파일 할 수 있습니다.


역사적인 통찰력과 Google에 올바른 오류 메시지를 보내 주셔서 감사합니다!
명백히

4
이것은 원래 Bourne 쉘의 소스 코드가 아니며 수정 된 OpenSolaris sh입니다. 그것은 Bourne 껍질이지만 수십 년의 진화를 거친 후입니다. Unix V7과 함께 제공된 본 Bourne 쉘 은 Unix Heritage Society
Stéphane Chazelas

1
@ StéphaneChazelas 엄밀히 말하면, 당신은 평소와 동일합니다. 그러나 Solaris 10에서 사용 된 쉘과 최신 플랫폼에서 컴파일 할 수있는 소스 코드를 언급 할 때 "원본 Bourne 쉘"을 작성하지 않고 "이 원본 Bourne 쉘"을 작성했습니다. Bourne 쉘은 1977 년에서 1989 년 사이에 몇 가지 기능이 추가되었지만 지난 25 년 동안 근본적으로 새로운 플랫폼 및 버그 수정에 대한 포팅 / 적응을 제외하고는 중단되었습니다.
jlliagre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.