Solaris /bin/sh 获取文件的行为与执行文件的行为不同。为什么?

Solaris /bin/sh 获取文件的行为与执行文件的行为不同。为什么?

我有一个将在 Solaris 计算机上bash调用的脚本。/bin/sh当我运行脚本时/bin/sh ./solarisSh,它起作用了。当我获取相同的脚本时,它失败了。

我知道bash和 Bourne Shell 几乎没有什么相似之处。这不是我的问题。

我的问题是:为什么 Solaris/bin/sh在获取文件时与单纯执行文件时的行为如此不同?

这是数据...

ns2 ~/tmp 560> env -i /bin/sh -x
$ uname -a
+ uname -a 
SunOS ns2 5.7 Generic_106541-15 sun4m sparc SUNW,SPARCstation-10
$ cat ./solarisSh
+ cat ./solarisSh 

[ ! "$BASH" ] && {
    >&2 echo "ERROR: $0 is a Bash script.  Exiting."
    return 1 2> /dev/null || exit 1
}

haveRootPriv() {
    local idCmd=/usr/bin/id
    local euid
    local uid

    [[ $OHM_OS == "SunOS" ]] && idCmd=/usr/xpg4/bin/id
    if (( ( $( $idCmd -ru) == 0 ) || ( $( $idCmd -u) == 0 ) )); then
       echo 1
       return 0
    fi
    echo 0
    return 1
}
$ /bin/sh -x ./solarisSh 
+ /bin/sh -x ./solarisSh 
+ [ !  ] 
+ echo ERROR: ./solarisSh is a Bash script.  Exiting. 
ERROR: ./solarisSh is a Bash script.  Exiting.
+ return 1 
$ . ./solarisSh 
+ . ./solarisSh 
syntax error: `$' unexpected
$ 

错误:./solarisSh 是 Bash 脚本。退出。这是我在获取文件时所期待的。我得到的是语法错误:“$”意外

回顾一下这个问题:为什么 Solaris /bin/sh 在获取文件时与单纯执行文件时的行为如此不同?

我想我还有第二个问题(抱歉):为什么-x在获取文件时不起作用?

谢谢。
-埃里克

答案1

删除$(...)命令替换可以消除我在 5.10 上的失败。这表明您所看到的是.在执行之前解析整个文件的效果,并在不受支持的语法中遇到错误。相比之下,脚本是逐行解析的,因此它会在注意到语法错误之前退出。

通过实验,您可以插入其他语法错误并看到相同的行为:.提前失败,并sh执行到格式错误的行。

为什么?我不知道。在我能找到的任何地方似乎都没有具体记录。手册页只是说.

 . filename

     Read and execute commands from filename and return.  The
     search path specified by PATH is used to find the direc-
     tory containing filename.

的文档<<word说“shell 输入被读取到...”,这可能意味着简约的解析,但我在任何地方都没有看到任何明确的内容。一般来说,逐行解析对于 shell 脚本来说非常常见,例如,Bash 在这两种情况下都是这样做的。

为什么在获取文件时 -x 不起作用?

只要命令确实开始执行,它就确实有效。在解析阶段不会打印任何内容。


对于这个特定的示例,使用` ... `-style 命令替换是可行的,但真正的脚本可能更复杂。

相关内容