"내보내기 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.