bash 의 export 명령어관련 질문.

elfs의 이미지

그냥 쉘상에서 export PS1="\033[01;35mshell\033[00;37m$ " 이라고 하면 먹는데요.

이걸 쉘로 짜서

#!/bin/sh
SHELL="\033[01;35mshell\033[00;37m$"
export PS1=$SHELL

이라고 하면 안먹더라구요...

어떻게 해야 쉘스크립트에서 작동하게 할 수 있을까요?

jedi의 이미지

쉘스크립트가 실핼될때 새로운 쉘에서 실행되는 걸로 압니다.

스크립트가 종료되면 쉘도 사라지죠.

현재 사용하는 쉘에는 영향을 못주죠.

답이 되었는지 모르겠군요.

+++ 여기부터는 서명입니다. +++
국가 기구의 존속을 위한 최소한의 세금만을 내고, 전체 인민들이 균등한 삶을
영위할 수 있는 착취가 없는 혁명의 그날은 언제나 올 것인가!
-- 조정래, <태백산맥> 중에서, 1986년

익명 사용자의 이미지

$(HOME)/.bashrc 에 넣으면 되지 않던가요 ? 한번 해보세요.

stoneshim의 이미지

source 로 실행시키면 되죠?

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

pynoos의 이미지

elfs wrote:
그냥 쉘상에서 export PS1="\033[01;35mshell\033[00;37m$ " 이라고 하면 먹는데요.

이걸 쉘로 짜서

#!/bin/sh
SHELL="\033[01;35mshell\033[00;37m$"
export PS1=$SHELL

이라고 하면 안먹더라구요...

어떻게 해야 쉘스크립트에서 작동하게 할 수 있을까요?

원래의 sh 은 export 뒤에 변수명만 오며, 대입문이 오지 않습니다.
대입을 먼저하시고 export에는 변수만 쓰세요.

익명 사용자의 이미지

Quote:
원래의 sh 은 export 뒤에 변수명만 오며, 대입문이 오지 않습니다.
대입을 먼저하시고 export에는 변수만 쓰세요.

그렇다면 이렇게 하는게 옳은거군요.

PS1="\e[1;32m[\t \u]\\$\e[0;0m "
export PS1
elfs의 이미지

source 로 실행시키니까 되더군요.

그 이외에 코멘트 남겨주신 분들도 감사드립니다.

그런데 문제는 이 스크립트가 명령어 코맨드상이 아닌 자동으로 작동되게 하려는 것입니다.

즉 ./test.sh 이런식으로 작동이 되어야 한다는 것인데요..

제가 현재 터미널에 로그인 해서 source test.sh 라고 하면 물론 되지만

이걸 예를들어 이렇게 하니 안되더군요..

test1.sh 라는 파일을 만들고

#!/bin/sh
source test.sh

라고 한다면 말이지요..

어떻게 하면 스크립트가 실행되면서 자체적으로 source test.sh 한것과 동일한 효과를 볼 수 있는것이지요?

xfmulder의 이미지

이미 실행된 스크립트에서 source 로 실행한것처럼 하는건 절대 안됩니
다.
반드시 source test.sh 또는 . test.sh (. 명령)을 써야 합니다.

그 이유는 현재 쉘이 어떤 명령을 실행할때 source 나 . 명령이 아닌경우 (예를 들면 $ ls ) 현재 쉘이 CHILD 를 포크해서 execlp 로 ls 명령을 실행하고 원래의 쉘은 SIGCLD 가 올때까지 (즉, 자식( ls) 이 죽을때 까지 pause() 하고 있기 때문에 원래 쉘로 돌아왔을때는 자식이 export 한것은 전혀 소용 없게 됩니다.

export 는 putenv() 함수를 이용하여 특정문자열("변수명=변수값") 을 환경영역에 옮기는 명령이고 이건 CHILD 들에게만 영향을 미치기 때문입니다.

내 자식들도 나처럼 !!

elfs의 이미지

감사합니다. 구조에 대해서 좀 더 이해하게 되었습니다.

그런데 궁금한것은..

그렇다면 source 나 . 을 대신하여 현재 부모프로세스의 환경변수를 조정하는 프로그램을 짜는건 불가능 하다는 것인가요?

어떤 프로그램이건 그것은 자식프로세스를 양산하게 되고 결국 자식프로세서만이 제어된다는 말씀이신것 같은데요..

그렇다면 로그인 할때 이외에는 현재 나 자신의 bash 의 환경변수를 설정하는 것은 프로그램으로는 불가능 하다는 뜻으로 들립니다. 다른 방법이 없는걸까요?

jcly2의 이미지

확실하게 init 프로세스를 수정해 보세요.

모든 프로세스의 부모 프로세스이니까 자식 프로세스들은 모두 init에서 설정한 환경 변수들을 가져다 사용하니까여..

init에서 execve를 사용해서 shell을 fork했던 것으로 기억하는데 이때 필요한 환경 변수들을 추가/수정하면 원하는데로 사용할 수가 있어여..

elfs의 이미지

init 프로세스를 수정하라는 말씀이 무슨 뜻인지 이해를 못하고 있습니다.--

혹 어떤 문서를 보면 좋을지 충고 부탁드립니다.

pynoos의 이미지

elfs wrote:

그렇다면 source 나 . 을 대신하여 현재 부모프로세스의 환경변수를 조정하는 프로그램을 짜는건 불가능 하다는 것인가요?

어떤 프로그램이건 그것은 자식프로세스를 양산하게 되고 결국 자식프로세서만이 제어된다는 말씀이신것 같은데요..

저도 궁금한 것이... 무슨 일을 하다가 이런 필요를 느끼셨죠?
혹시 다른 방법이 있는지 찾아 보는 것도 괜찮을 것 같습니다.

일반적인 방법이 아닌 프로그래밍을 하시려고하니... elfs님의 답변에는 일반적인 답변은 기대하기 힘들 것 같습니다.

elfs의 이미지

Quote:
일반적인 방법이 아닌 프로그래밍을 하시려고하니... elfs님의 답변에는 일반적인 답변은 기대하기 힘들 것 같습니다.

질문은 단순합니다.

set 상에 정의되어있는 환경변수를 프로그램으로 제어하는것이 알고싶은 것이지요. 처음엔 export 에 관련해서의 답만 알면 문제가 해결될 줄 알았으나 깊게 파고들다 보니 더욱 복잡한 구조가 있어서 그것에 대한 세부적인 질문을 한 것입니다. 프로그래밍 게시판에 프로그램적인 질문을 한것인데 무엇이 문제인지 제게 알려주시겠습니까?

다시한번 정리해서 질문하면

1. 전 프로그램(그것이 c가 되었던 bash script 가 되었든)을 이용하여 현재쉘의 환경변수(ex: PATH= or LANG=) 를 수정하려 한것입니다.
2. 그런데 그것이 제가 스크립트를 잘못짜서 현재 환경변수에 조정이 안되는 줄 안것이지요.
3. 그런데 답변들을 읽다보니 제가 크게 구조적인 문제점에 대해서 잘못알고 있었다는 사실을 느낀것입니다. 즉 부모프로세서와 자식프로세서에 관한 사항이지요.
4. 그래서 그 부분에 대해서 제가 혼돈하고 있으니 jcly2 님께서 init 프로세스를 수정하라는 답변을 해 주셨고 그것이 어떤 의미인지를 잘 이해를 못하기에 그것을 알기위해 읽어야 할 문서가 어떤것인지를 질문한 것입니다.

뭐가 문제죠? :wink:

pynoos의 이미지

elfs wrote:
set 상에 정의되어있는 환경변수를 프로그램으로 제어하는것이 알고싶은 것이지요.

4. 그래서 그 부분에 대해서 제가 혼돈하고 있으니 jcly2 님께서 init 프로세스를 수정하라는 답변을 해 주셨고 그것이 어떤 의미인지를 잘 이해를 못하기에 그것을 알기위해 읽어야 할 문서가 어떤것인지를 질문한 것입니다.

결국 제가 또 같은 질문을 하게 되었는데말이죠... :)
어쩌다가 set 상에 정의 되어있는 환경변수를 프로그램으로 제어할 필요가 있었냐하는 것이구요...

init 프로세스를 수정한다고 해서 현재 shell의 환경변수가 바뀌는 것이 아닙니다.
즉, 모프로세스나 모프로세서의 모프로세스의 환경변수가 변한다고, 자동으로
그 하위 프로세스의 환경변수에 영향을 주지않습니다.

elfs의 이미지

Quote:
어쩌다가 set 상에 정의 되어있는 환경변수를 프로그램으로 제어할 필요가 있었냐하는 것이구요...

그냥 어떤 프로그램을 개발할까 생각하다가 아주아주 단순한 호기심에서 부터 발생한 질문입니다.

별다른 이유없이 궁금할 수도 있지 않겠습니까? :)

하다보니 궁금해 지더군요. 왜 이게 안될까...하고..

pynoos의 이미지

엄.....

전... 뭐 그냥 단지 호기심인데.. 도가 지나쳤다면 용서하시기 바랍니다. :oops:

공개 해야 한다안한다라는 생각이 아니라, 저는 문제를 알면 다른 각도로 볼 수 있지 않을까해서였는데... :roll:

용서하세요...~~

elfs의 이미지

글을 수정하기 전에 답변을 다셨군요..

잠시 지나치게 반응한점 사과드립니다. :oops:

그냥 궁금하더라구요..

현재 사용하고 있는 쉘의 환경변수를 프로그램으로 바꿀 수 있는 방법이라는게..
없는건가요? --a..

"엇..글 20개 이상 올리면 user 가 되는거구나..--a."

eungkyu의 이미지

elfs wrote:
현재 사용하고 있는 쉘의 환경변수를 프로그램으로 바꿀 수 있는 방법이라는게..
없는건가요? --a..

"프로그램"으로 바꿀 수는 없습니다 8)

그렇지만 쉘의 function기능을 이용하면 마치 프로그램처럼 사용해서 쉘의 환경변수를 바꿀 수 있습니다. 실제로 mc라는 프로그램이 그런 식으로 현재 디렉토리를 바꾸는 기능을 수행하는 것으로 알고 있습니다 :)

elfs의 이미지

function 기능으로 해결했습니다.

문제를 이래저래 찾아가면서 참 많이 배웠습니다.

답변 주신분들께 감사드립니다.

dreammill의 이미지

function기능이라는게 shell script내부에서 정의해서 사용하는 함수 맞나요?

function기능으로 어떻게 해결하셨는지 알고싶네요.

doyun0082의 이미지

이것 저것 삽질하다가 저도 Shell script 자체가 fork()를 통하여 새로운 process로 생성되기 때문에 보안/개념상 절대 안된다고 결론을 내렸습니다.
http://kldp.org/node/20444 -> 그런데 관련 자료를 찾아보니 하나도 없어요, 아마도 보안 때문에 mc도 막아버리고 bash도 막아버린게 아닐까 합니다.

다만, 꽁수가 있을 뿐이죠.

1. 요건, 쉘에서 놀다보면 질리도록 보는 거죠.
$source xx.sh

2. 이건 처음 보는데 꽤 쓸만하네요, 현재 Shell에서 실행하는 겁니다. 대신 exit 구문 있으면 쉘도 꺼져요...
$. xx.sh

3. function 기능, 요게 가장 편하려는 의도에 가깝습니다. 인간의 편함은 과연 어디까지 인지..
3.1. function이 있는 쉘 스크립트를 하나 만든다. (옵션)
3.2. .bashrc에 function이 있는 쉘 스크립트를 불러 오도록 source xx.sh를 추가하여 준다. (간단하다면 .bashrc에 직접 작성하는 것도 나쁘지 않음)
3.3. 이제 함수이름만 쉘에 입력하면 맘대로 환경 변수를 바꿀수 있습니다.

neocoin의 이미지

여태 현재 디렉토리 변경하는 스크립트를 짜놓고 늘

. image

이런 식으로 사용했는데, function을 사용할 생각도 하지 않았씁니다. 감사합니다. :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.