获取脚本时“无法 cd 到 /home/user”

Kar*_*120 6 bash cd-command shell-script

我有这个脚本:

echo $HOME
cd $HOME
cd /
cd /usr/local/src/
Run Code Online (Sandbox Code Playgroud)

当我像这样运行时

. script.sh
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

/home/user
: No such file or directory
: No such file or directory
: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如果我正常运行(我#!/bin/bash在第一行之前添加)

sh script.sh
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

: not found.sh: 2: script.sh
/home/user
script.sh: 3: Can't cd to /home/user
script.sh: 4: Can't cd to /
script.sh: 5: Can't cd to /usr/local/src/
Run Code Online (Sandbox Code Playgroud)

脚本$HOME每次都从目录运行。如果我从 shell 一个一个地运行每个命令,它会毫无问题地执行(cd $HOME从内部调用$HOME根本不会改变目录)。

我必须做什么才能使这项工作发挥作用?

vin*_*c17 18

您的脚本中有 CR (^M) 字符。将其转换为 Unix 行尾(仅 LF)。以便携方式:

tr -d '\r' < your_script > output_script
Run Code Online (Sandbox Code Playgroud)

基于Olivier Dulac 对CR 字符发生的情况的评论的一些解释: 首先,在shell 语言中,CR 字符不被视为特殊字符,例如不被视为空格且不被忽略。我写^M如下。

  • echo $HOME^M线,的含量$HOME,随后^M接着一个新行是输出。输出 CR 字符将光标放在第一列上,但由于它后面紧跟一个换行符,因此没有明显的效果。

  • 在该cd $HOME^M行中,由于$HOME和 CR 字符之间没有空格,因此它们都在同一个参数中$HOME^M,并且该目录不存在。在错误信息中,后面的 CR 字符$HOME只是输出,将光标放在第一列上,以便该行的开头被消息的其余部分覆盖(如果有):“:没有这样的文件或目录”与 bash (您的第一个示例),没有任何破折号(您的第二个示例sh script.sh#!/bin/bash因为您明确要求使用 运行脚本而被忽略sh,这在您的情况下似乎是破折号)。错误消息完全取决于外壳。例如,zsh 检测到 CR 字符不可打印并输出如下消息:

    cd: 没有这样的文件或目录:/usr/local/src/^M

(使用字符“^”和“M”,而不是 CR 字符),这样可以更轻松地检测问题的原因。否则,您需要将 stderr 重定向/管道到某些可以显示特殊字符的实用程序,例如cat -veOlivier 建议的或 to hd,它提供流的字节序列。