Chinaunix

标题: 关于 bash 模拟 sh 时针对环境变量的讨论 [打印本页]

作者: FH    时间: 2007-01-02 08:33
标题: 关于 bash 模拟 sh 时针对环境变量的讨论
当bash以sh为名运行时,在交互非login模式下,其继承了所有环境变量(包括任何用户定义的变量),唯独不继承PS*!
号称是靠向POSIX,但是俺用过的所有Unix(AIX、HPUX、SCO)的sh,在该模式下都是继承PS*变量的。

俺的环境:bash 3.00

[ 本帖最后由 platinum 于 2007-1-10 08:19 编辑 ]
作者: langue    时间: 2007-01-02 09:00
原帖由 FH 于 2007-1-2 08:33 发表
当bash以sh为名运行时,在交互非login模式下,其继承了所有环境变量(包括任何用户定义的变量),唯独不继承PS*!
号称是靠向POSIX,但是俺用过的所有Unix(AIX、HPUX、SCO)的sh,在该模式下都是继承PS*变量的。

俺的环境:bash 3.00


这种现象变态但合法而和谐地存在着。
作者: FH    时间: 2007-01-02 09:36
原帖由 langue 于 2007-1-2 09:00 发表


这种现象变态但合法而和谐地存在着。


感觉以前的bash好像没有这么变态
作者: FH    时间: 2007-01-02 09:39
解决方案:

/etc/profile.d/MyPrompt.sh
export PS1='${PWD}> '

/etc/profile.d/MyPrompt.csh
set prompt='%/> '

/etc/bashrc
......
export ENV=/etc/profile

作者: kenduest    时间: 2007-01-02 13:12
原帖由 FH 于 2007-1-2 08:33 发表
当bash以sh为名运行时,在交互非login模式下,其继承了所有环境变量(包括任何用户定义的变量),唯独不继承PS*!
号称是靠向POSIX,但是俺用过的所有Unix(AIX、HPUX、SCO)的sh,在该模式下都是继承PS*变量的。 ...


其实,你的问题最有可能的只是,因为你当初用的系统都是把 PS1 宣告为 export/environment variable,而不是一般 local 性质变数,所以才会有这种差异。

这样吧?你还有在那些的 AIX,HUPX 等系统吗?你可不可以登入哪些系统后,执行 env | grep PS1 结果列一下呢 ? 这样一看就知道原因了。

--

[ 本帖最后由 kenduest 于 2007-1-2 13:15 编辑 ]
作者: FH    时间: 2007-01-02 21:19
原帖由 kenduest 于 2007-1-2 13:12 发表


其实,你的问题最有可能的只是,因为你当初用的系统都是把 PS1 宣告为 export/environment variable,而不是一般 local 性质变数,所以才会有这种差异。

这样吧?你还有在那些的 AIX,HUPX 等系统吗?你可不 ...


晕!
你自己试一下就知道了
俺Unix玩了十多年,Linux也玩了十年了,什么问题俺还看不清?
作者: kenduest    时间: 2007-01-03 01:09
原帖由 FH 于 2007-1-2 21:19 发表
晕!
你自己试一下就知道了
俺Unix玩了十多年,Linux也玩了十年了,什么问题俺还看不清?


态度好像蛮高傲的 ?

PS1 本来就不是 export variable,所以怎么会有环境变量复制继承的特性呢?所以问题拉回来看,若你只是要能够 PS1 变量继承下去,请把 PS1 变量设定为 export variable 就可以了,不就是这样而已 ? 这样你就改改您 linux distro 的 bash 配置档即可,不是呼?

我都测试过了,于 bash 3 环境下把 PS1 变量设定为 export 变数后,就会具备复制继承的特性。

另外,也许该好好研究一下你的  .bashrc 配置,是否有改过 PS1 变量的程式码叙述。

--

[ 本帖最后由 kenduest 于 2007-1-3 01:18 编辑 ]
作者: FH    时间: 2007-01-03 09:39
原帖由 kenduest 于 2007-1-3 01:09 发表


态度好像蛮高傲的 ?

PS1 本来就不是 export variable,所以怎么会有环境变量复制继承的特性呢?所以问题拉回来看,若你只是要能够 PS1 变量继承下去,请把 PS1 变量设定为 export variable 就可以了,不就 ...


晕!你没看懂俺的问题吧?知道啥叫交互非login模式不?
你进vi,然后:!sh,再告诉俺有没有PS1!
真是你说的那么简单的事,俺都不好意思发帖子!

[ 本帖最后由 FH 于 2007-1-3 09:41 编辑 ]
作者: kenduest    时间: 2007-01-03 16:25
原帖由 FH 于 2007-1-3 09:39 发表
晕!你没看懂俺的问题吧?知道啥叫交互非login模式不?
你进vi,然后:!sh,再告诉俺有没有PS1!
真是你说的那么简单的事,俺都不好意思发帖子!


请上 GNU 的 coreutils mailing list 去回应你的问题,我想 developer 可以解决你的问题。因为在这边抱怨 bash 如何变态问题还是无解。

--

[ 本帖最后由 kenduest 于 2007-1-3 16:27 编辑 ]
作者: FH    时间: 2007-01-03 17:08
原帖由 kenduest 于 2007-1-3 16:25 发表


请上 GNU 的 coreutils mailing list 去回应你的问题,我想 developer 可以解决你的问题。因为在这边抱怨 bash 如何变态问题还是无解。

--


看清楚好不好,俺给出了解决方案,而不是像某人那样问题都没有看清也不实验就开始信口开河。
作者: kenduest    时间: 2007-01-04 00:18
原帖由 FH 于 2007-1-3 17:08 发表
看清楚好不好,俺给出了解决方案,而不是像某人那样问题都没有看清也不实验就开始信口开河。


看不出来你给了啥解决方案 ?

我等你好消息啊,不要忘记对 GNU coreutils mailing list 反应后的结果呈报一下。

--
作者: FH    时间: 2007-01-04 08:58
原帖由 kenduest 于 2007-1-4 00:18 发表


看不出来你给了啥解决方案 ?

我等你好消息啊,不要忘记对 GNU coreutils mailing list 反应后的结果呈报一下。

--


晕!4楼不是么?
就你这种看帖方式还申请版主?
但愿不要误杀、误导大家,阿门!
作者: kenduest    时间: 2007-01-04 09:40
原帖由 FH 于 2007-1-4 08:58 发表
晕!4楼不是么?
就你这种看帖方式还申请版主?
但愿不要误杀、误导大家,阿门!


嗯,你说的好啊,所以我不申请版主了


--
作者: bdwy    时间: 2007-01-04 15:42
汗S
FH不觉得确实有些过分么
人家好心好意,就算错了不是也得跟人说声谢谢
虽然我不懂这个,不知道谁对谁错
作者: FH    时间: 2007-01-04 15:58
原帖由 bdwy 于 2007-1-4 15:42 发表
汗S
FH不觉得确实有些过分么
人家好心好意,就算错了不是也得跟人说声谢谢
虽然我不懂这个,不知道谁对谁错


俺就这脾气,如果俺错了,俺从来都勇于承认错误。
俺最看不上的就是自以为高人一头就胡乱指手画脚的,见着这样的俺没有好脾气。
俺该谢什么?是帮俺解决了问题还是指出了俺的错误?也没见着别人跟你胡搅蛮缠的时候你还谢过人家啊。谁站着说话都不腰疼。
既然你承认自己不懂这个,就不要添乱了,谢谢!


[ 本帖最后由 FH 于 2007-1-4 16:01 编辑 ]
作者: yjh777    时间: 2007-01-04 16:08
原帖由 FH 于 2007-1-2 21:19 发表

晕!
你自己试一下就知道了
俺Unix玩了十多年,Linux也玩了十年了,什么问题俺还看不清?

看不看得清,跟玩儿了几年没关系!

晕!你没看懂俺的问题吧?知道啥叫交互非login模式不?
你进vi,然后:!sh,再告诉俺有没有PS1!
真是你说的那么简单的事,俺都不好意思发帖子!


这个问题确实不复杂,学知识没什么好意思不好意思的。
你的态度确实过分!应该学孔夫子三省乎己了。
作者: FH    时间: 2007-01-04 16:14
原帖由 yjh777 于 2007-1-4 16:08 发表

看不看得清,跟玩儿了几年没关系!



这个问题确实不复杂,学知识没什么好意思不好意思的。
你的态度确实过分!应该学孔夫子三省乎己了。


以后向你学习
作者: 網中人    时间: 2007-01-09 15:28
原帖由 FH 于 2007-1-2 08:33 发表
当bash以sh为名运行时,在交互非login模式下,其继承了所有环境变量(包括任何用户定义的变量),唯独不继承PS*!
号称是靠向POSIX,但是俺用过的所有Unix(AIX、HPUX、SCO)的sh,在该模式下都是继承PS*变量的。 ...


不知道 FH 所定義的“交互非login模式”跟我們所理解的是否一致的?還是有特定所指?
如下是 man bash 的內容:
       A login shell is one whose first character of argument zero is a -,  or
       one started with the --login option.

       An  interactive  shell  is one started without non-option arguments and
       without the -c option whose standard input and error are both connected
       to  terminals  (as determined by isatty(3)), or one started with the -i
       option.  PS1 is set and $- includes i if bash is interactive,  allowing
       a shell script or a startup file to test this state.


由此看來,只要完成 login 只後,在 command line 輸入 bash 或 sh 都應該是“交互非login模式”囉。
上面有提到 PS1 會被設定,我猜,這裡的設定應該是會被“重設”。而兄的問題在於 PS1 是否會從 parent shell 繼承下來吧? 如果我猜得對,那你看到的現象是正常的。

再看 man:
        When  an  interactive  shell that is not a login shell is started, bash
       reads and executes commands from ~/.bashrc, if that file exists.   This
       may  be inhibited by using the --norc option.  The --rcfile file option
       will force bash to read and  execute  commands  from  file  instead  of
       ~/.bashrc.

所以,除了從 parent 的 env/export 所繼承外,~/.bashrc 也是會影響環境結果的。
但不同的 linux distro 都會去修改 /etc/skel/.bashrc 的內容,
這時,最好請兄台說一下你目前试用的版本,還有 ~/.bashrc 的實際代碼才好分析。

有些版本,會從 ~/.bashrc 去 source /etc/bashrc,然後再去 source /etc/profile.d/*.sh 。
而有些則不一定會。
而 FH 兄前面的所謂解決方法,就是在 /etc/profile.d/*.sh 裡去執行,那是可以的。

不過,上面是用 bash 做 command ,如果換成 sh 的話:
       If bash is invoked with the name sh, it  tries  to  mimic  the  startup
       behavior  of  historical  versions  of sh as closely as possible, while
       conforming to the POSIX standard as well.  When invoked as an  interac‐\r
       tive  login  shell, or a non-interactive shell with the --login option,
       it first attempts to read and execute commands  from  /etc/profile  and
       ~/.profile,  in  that  order.   The  --noprofile  option may be used to
       inhibit this behavior.  When invoked as an interactive shell  with  the
       name  sh,  bash  looks for the variable ENV, expands its value if it is
       defined, and uses the expanded value as the name of a file to read  and
       execute.  Since a shell invoked as sh does not attempt to read and exe‐\r
       cute commands from any other startup files, the --rcfile option has  no
       effect.   A  non-interactive  shell  invoked  with the name sh does not
       attempt to read any other startup files.   When  invoked  as  sh,  bash
       enters posix mode after the startup files are read.

       When  bash  is  started in posix mode, as with the --posix command line
       option, it follows the POSIX standard for startup files.  In this mode,
       interactive  shells  expand  the ENV variable and commands are read and
       executed from the file whose name is  the  expanded  value.   No  other
       startup files are read.

所以看來是有 $ENV 這個變數來決定要執行的 script。
如果 ENV 沒設定,那就不執行了。
以我的 openSuSE10.2(GNU bash, version 3.1.17(1)-release )為例,
ENV 是設為 /etc/bash.bashrc 。裡面有多行關於 PS1 的設定,因此也會影響實際的 prompt 結果。

結論就是:不同的發行版本,可能得到的結果都不盡相同,只能以實際的 initial script 作參考。
作者: FH    时间: 2007-01-09 19:19
楼上的确很细致,佩服!
俺的是RHEL-AS4,俺也是man了以后找到的这个方法。
俺试了一下,如果直接在shell下面执行sh,是能够继承PS1的,但是进入了vi就不行了,从其它程序访问sh应该也是这样(推理),但是同样的情况俺在AIX和HP-UX上都做了试验,没有这个问题,俺还特意在HP-UX上man了sh-posix,里面没有提到这个问题。
作者: chexyo    时间: 2007-01-09 19:49
几个牛人在讨论,我怎么也看不懂,MS没体会到
作者: kenduest    时间: 2007-01-10 02:28
原帖由 FH 于 2007-1-9 19:19 发表
楼上的确很细致,佩服!
俺的是RHEL-AS4,俺也是man了以后找到的这个方法。
俺试了一下,如果直接在shell下面执行sh,是能够继承PS1的,但是进入了vi就不行了,从其它程序访问sh应该也是这样(推理),但是同样 ...


写个程式测看看不就知道了呼 ? 下面测试环境的 ENV 变数都没有指定任何内容。


  1. Linux:kendlee@~/tmp> cat test.c
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/wait.h>

  7. int main()
  8. {
  9.   pid_t child_p;

  10.   printf("getenv(\"PS1\") return %s\n\n",getenv("PS1"));

  11.   child_p = fork();

  12.   if (child_p == 0) {
  13.     printf("Executing sh program !\n");
  14.     execlp("sh","sh",NULL);
  15.   }

  16.   else {
  17.     waitpid(child_p,NULL,0);
  18.     printf("end... see you !\n");
  19.   }

  20.   return 0;
  21. }

复制代码


看一下执行结果,这是有是先把 PS1 设定为 export variable:


  1. Linux:kendlee@~/tmp> ./test
  2. getenv("PS1") result: Linux:\u@\w>

  3. Executing sh program !

  4. Linux:kendlee@~/tmp>
  5. Linux:kendlee@~/tmp> echo $PS1
  6. Linux:\u@\w>
复制代码


看起来 child process 还是有继承到。

再看看另外一个执行结果,这是有是先把 PS1 设定为一般变数,也就是取消非 export  variable 性质:


  1. Linux:kendlee@~/tmp> ./test
  2. getenv("PS1") result: (null)

  3. Executing sh program !

  4. sh-3.1$
复制代码


PS1 不是 export variable,所以 child 没有 PS1 变数继承下来,所以最终显示 sh$ 提示字元。

所以这边讨论来看,当初我最前面提到文章内部份的描述并没错误,这就是我会问你是否没有把 PS1 设定为 export variable 的原因点,只是你没正面回应我,只是一直告诉我搞不清楚何谓 interactive mode ... 因为实际一般测试方式就是在命令列输入执行 sh 来测试,为 export variable 时是会继承下去。

另外拿 mc 来测试一下好了...... 结果与上面也相同。

那问题拉回来看,是真的为变态的 bash 的问题吗?老实说我认为问题搞不好与 vi 本身有关系。

然后我去看了一下 vim7 的 source code :


  1.     if (execl("/bin/sh", "sh", "-c", cmd, NULL) == -1)
复制代码


发现原来是使用 /bin/sh -c 方式来执行命令,来看 bash manpage:


  1. An  interactive  shell  is one started without non-option arguments and
  2.        without the -c option whose standard input and error are both connected
  3.        to  terminals  (as determined by isatty(3)), or one started with the -i
  4.        option.  PS1 is set and $- includes i if bash is interactive,  allowing
  5.        a shell script or a startup file to test this state.
复制代码


所以因为有传 -c,这时候不是 interactive mode,简单说就是为 non-interactive mode。

那再看一下 bash info page 文件:


  1. Alternatively, startup scripts may examine the variable `PS1'; it is
  2. unset in non-interactive shells, and set in interactive shells.  Thus:

  3.      if [ -z "$PS1" ]; then
  4.              echo This shell is not interactive
  5.      else
  6.              echo This shell is interactive
  7.      fi

复制代码


所以说 non-interactive 时 PS1 会被 unset 而消失掉,所以不会有复制继承功能。

FH 兄你说会继承,这下真的奇怪了...... 若是真的会继承,那可能原因大概只有这点: "你系统用的 vi 程式码内容写法不一样",比方用 execlp 直接呼叫外部程式,不透过 sh -c 来达成,那我想这样 PS1 就真的会复制继承下去而不会被 unset 掉。

关于最后论点,其他人不知道有其他想法呼?

--

[ 本帖最后由 kenduest 于 2007-1-10 03:22 编辑 ]
作者: 網中人    时间: 2007-01-10 02:50
不妨讓我們做做實驗,來進一步釐清問題所在。

如下是版本資訊:
kenny@x40:~> bash --version
GNU bash, version 3.1.17(1)-release (i586-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

實驗一:如下是針對 bash 的測試:
kenny@x40:~> echo "$PS1"
$(ppwd \l)\u@\h:\w>                         #這裡是原 PS1 值
kenny@x40:~> echo $ENV
/etc/bash.bashrc                        #這是原 $ENV 路經
kenny@x40:~> PS1="xxx: "        #修改 PS1,但沒有輸出為 env var
xxx: bash                                        #進入 bash
kenny@x40:~> exit                        #prompt 被 reset 了,看來是被 .bashrc 修改了
exit                                                #退出
xxx: bash --norc                                #再次進入 bash,但使用了 --norc 選項
bash-3.1$ exit                                # 結果 prompt 設為 bash 的 default 值
exit                                                #退出
xxx: export PS1                                #將 PS1 輸出為 env var
xxx: bash                                        #進入 bash
kenny@x40:~> exit                        #似乎 export 前後沒產生變化
exit                                                #退出
xxx: bash --norc                                #使用 --norc
xxx: exit                                        #注意!這次不是 default 值,
                                                        #而是跟 parent 一致,這說明了 env var 是可以繼承的
exit                                                #退出

實驗二:為了還原環境,開一個新的 bash sehll 來測試 sh :
kenny@x40:~> echo "$PS1"
$(ppwd \l)\u@\h:\w>                         #原設 PS1 定值
kenny@x40:~> echo $ENV
/etc/bash.bashrc                        #這是原 $ENV 路經
kenny@x40:~> PS1="xxx: "        #修改 PS1,但沒有輸出
xxx: sh                                                #進入 sh
kenny@x40:~> exit                        # 跟 bash 一樣的結果
exit                                                #退出
xxx: sh --norc                                #嘗試 --norc
kenny@x40:~> exit                        #也一樣,沒影響
exit                                                #退出
xxx: export PS1                                #將 PS1 輸出為 env
xxx: sh                                                #進入 sh
kenny@x40:~> exit                        #還是被 reset ,應是執行 ENV 路徑的關係
exit                                                #退出
xxx: sh --norc                                #使用 --norc
kenny@x40:~> exit                        #還是不受影響,ENV 依然有效
exit

結論一:
由上面的測試,可以看到如下的結論:
1)bash 在 --norc 選項下,并不執行 .bashrc
2)sh 有沒 --norc 選項,都會展開 $ENV 并執行之
3)無論如何,當 parent shell 的 PS1 被輸出為 env var 之後,
        就會被 sub shell 繼承,只是最後結果又被 .bashrc 或 $ENV 的 script 修改了。
        換句話來說:
                當 new shell 沒有 PS1 之賦值時(可從 .bashrc 或 $ENV 的 script 來設定),
                shell prompt 會採用 default 值:\s-\v\$
        * 我相信這就是 FH 兄整個問題的原因所在了。

實驗三:為了驗證上面第 3 點,以下專門針對 ENV 的有無進行測試:

kenny@x40:~> echo "$PS1"
$(ppwd \l)\u@\h:\w>                         # 這是原 PS1 值
kenny@x40:~> unset ENV                # 取消 ENV
kenny@x40:~> echo "$ENV"
                                                        #確認 ENV 已被取消
kenny@x40:~> PS1="xxx: "        #修改 PS1,但不做輸出
xxx: bash                                        #進入 bash
kenny@x40:~> exit                        #看來不受 ENV 影響
exit                                                #退出
xxx: bash --norc                                #使用 --norc
bash-3.1$ exit                                #被設為 bash default,看來也與 ENV 無關
exit                                                #退出
xxx: export PS1                                #將 PS1 輸出
xxx: bash                                        #進入 bash
kenny@x40:~> exit                        #一樣,看來還是被 .bashrc 改了
exit                                                #退出
xxx: bash --norc                                #不用 rc
xxx: exit                                        #注意!這次從 env 裡繼承了 PS1 值
exit

結論二:
從上面看來,bash 根本就不受到 $ENV 的影響,但卻受到 .bashrc 影響。
實驗一跟實驗三基本上沒有差異。

實驗四:下面驗證 sh:

kenny@x40:~> echo "$PS1"
$(ppwd \l)\u@\h:\w>                         #這是原 PS1 值
kenny@x40:~> unset ENV                #取消 ENV
kenny@x40:~> echo "$ENV"
                                                        #確認取消
kenny@x40:~> PS1="xxx: "        #修改 PS1,但不輸出
xxx: sh                                                #進入 sh
sh-3.1$ exit                                        #被設為 default
exit                                                #退出
xxx: sh --norc                                #使用 --norc
sh-3.1$ exit                                        #看來沒影響
exit                                                #退出
xxx: export PS1                                #輸出 PS1
xxx: sh                                                #進入 sh
xxx: exit                                        #繼承了 PS1!
exit                                                # 退出
xxx: sh --norc                                #使用 --norc
xxx: exit                                        #還是繼承 PS1!
exit

結論三:
看來, sh 的確是受到 ENV 的影響而改變了 PS1 的值,但卻不受 .bashrc 影響。

實驗五:專門針對 PS1 的賦值來測試:
kenny@x40:~> unset ENV                #取消 ENV
kenny@x40:~> export PS1="xxx: "        #修改 PS1,并一同輸出
xxx: bash --norc                                #以 --norc 進入 bash,避免 PS1 被修改
xxx: exit                                        #繼承了 PS1
exit                                                #退出
xxx: sh                                                #進入 sh
xxx: exit                                        #繼承了 PS1
exit                                                #退出
xxx: unset PS1                                #取消 PS1,這是測試重點!!
bash --norc
bash-3.1$ exit                                #bash 的 PS1 設為 default
exit                                                #退出
sh
sh-3.1$ exit                                        #sh 的 PS1 也為 default
exit

所以,這印證了結論一第三點,也就是:
---如果 PS1 為 env,那就繼承;如果沒賦值,就使用 default。

實驗六:再來針對 FH 兄關於 vi 的疑問:
kenny@x40:~> unset ENV                #取消 ENV
kenny@x40:~> export PS1="xxx: "        #修改 PS1,并一同輸出
xxx: set | grep 'PS[0-9]'                #抓取 PS 相關的值
PS1='xxx: '                                        #確認 PS1 被修改
PS2='> '
PS4='+ '

xxx: vi                                        #進入 vi
                                                #然後我執行--- :!set | grep 'PS[0-9]'
PS4='+ '                                        #結果只有 PS4 (哈別去問 sony 哦)

Press ENTER or type command to continue
                                                #然後我再執行--- :!sh
sh-3.1$ exit                                #結果 PS1 設為 default,印證了結論一第 3 點。
exit                                        #返回 vi

Press ENTER or type command to continue
                                                #退出 vi
xxx:

------
好了,實驗結束。
我不敢保證我的實驗是完整而正確的,這有待其它朋友進一步來檢驗。
但從結果來看,我會認同 kenduest 兄的說法。
至於 FH 兄,在下的建議如下:
1)可能兄台平時在清茶跟人吵架習慣了,大可不必將此習性帶到技術版面裡。
2)謙虛永遠是受益的,這跟年紀或經驗無關。
3)嚴謹的實驗是有必要的,如果只是一兩個現象就過早歸納結論,有時會有錯漏。
4)假如我批評得不對,請您原諒。

謝謝!
作者: FH    时间: 2007-01-10 08:44
to 楼上:
export PS1俺是绝对不会疏忽遗忘的,因此才有变态一说。
刚刚在SUSE LINUX Enterprise Server 9 (i586) - Kernel 2.6.5-7.97-bigsmp上试验,结果一如RHEL-AS4。

xxx@linux:~> echo $ENV

xxx@linux:~> vi
:!sh
sh-2.05b$ exit
:q!
xxx@linux:~> echo $PS1
\u@\h:\w>
xxx@linux:~> export PS1
xxx@linux:~> vi
:!sh
sh-2.05b$ exit
:q!

[ 本帖最后由 FH 于 2007-1-10 08:46 编辑 ]
作者: 網中人    时间: 2007-01-10 10:10
前面我們已經給出結論了:
---如果 PS1 為 env,那就繼承;如果沒賦值,就使用 default。

kenduest 兄也驗證出 vi 所調用的 shell 不是 interactive,因為有 -c 選項。
因此 vi 的 shell 并沒有 PS1, 也就是“如果沒賦值,就使用 default”。
這樣你明白了嗎?
作者: 枫影谁用了    时间: 2007-01-10 22:36
改版咯...好像回到以前的界面了..好熟悉啊
作者: kenduest    时间: 2007-01-10 22:56
原帖由 FH 于 2007-1-10 08:44 发表
to 楼上:
export PS1俺是绝对不会疏忽遗忘的,因此才有变态一说。
刚刚在SUSE LINUX Enterprise Server 9 (i586) - Kernel 2.6.5-7.97-bigsmp上试验,结果一如RHEL-AS4。


你可以把你说的 AIX 与 HPUX 环境测试 vi 执行使用 :!sh 后情况也贴出来一下吗?这样好判断问题点.

--

[ 本帖最后由 kenduest 于 2007-1-10 23:10 编辑 ]
作者: wwy    时间: 2008-02-16 22:13
感觉网中人的实验结论正确但不太全面,有一些疑惑:
1、$BASH_ENV 和 $ENV 是一样的吗?
2、sh的--norc参数有没有意义?


以下个人的一些理解之后的总结,如果有偏差还望指点:

BASH

1、交互式的登录shell
载入的信息:
/etc/profile
~/.bash_profile( ->  ~/.bashrc  ->  /etc/bashrc)
~/.bash_login
~/.profile

2、非交互的登录shell
载入的信息:
/etc/profile
~/.bash_profile ( ->  ~/.bashrc  ->  /etc/bashrc)
~/.bash_login
~/.profile
$BASH_ENV

3、交互式的非登录shell
载入的信息:
~/.bashrc ( ->  /etc/bashrc)

4、非交互式的非登录shell
载入的信息:
$BASH_ENV


SH

1、交互式的登录shell
载入的信息:
/etc/profile
~/.profile

2、非交互的登录shell
载入的信息:
/etc/profile
~/.profile

3、交互式的非登录shell
载入的信息:
$ENV

4、非交互式的非登录shell
载入的信息:
nothing
作者: 網中人    时间: 2008-02-17 20:52
感謝 wwy 兄的指教與補充。
不過,您的問題,我一時沒能驗證。且憑直覺回答如下:
1)應該不一樣。如果帶了 BASH_ 的字眼,應該只有 bash 才會參考。就算 sh 是 bash 的 link,也不參考。
2)這個還需進一步在不同的版本測試。不敢妄答。
作者: ghosTM55    时间: 2008-02-17 21:27
学到了不少东西,收藏了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2