无法在 WSL 中使用 bash 脚本“cd”或更改目录

Fem*_*fer 12 command-line bash scripts windows-subsystem-for-linux

我在我的 Windows 机器上安装了Ubuntu bash,所以我可以在工作之外测试 linux 脚本。我创建了一个非常简单的脚本,其中包含基本的“hello world”和一个更改目录 (cd),但是在执行时会显示 hello world。它在 cd 到目录行上出错。

这是错误:

$ ./test.sh
hello world
zipping away
./test.sh: line 6: cd: $'/home/fjaffer/temp\r\r': No such file or directory
./test.sh: line 7: $'\r': command not found
ffr@DP-PC:~$
Run Code Online (Sandbox Code Playgroud)

我的脚本test.sh如下:

#!/bin/bash
echo "hello world"
echo "zipping away"
dir=/home/fjaffer/temp
cd $dir
Run Code Online (Sandbox Code Playgroud)

请指教?谢谢你。

Rav*_*ina 17

这是因为您在 Windows 机器上创建了脚本,因此在\r每行末尾添加了一些(回车)。

像这样删除它们:

tr -d '\r' < test.sh > new-test.sh
Run Code Online (Sandbox Code Playgroud)

还要引用变量的值:

cd "$dir"
Run Code Online (Sandbox Code Playgroud)

然后运行你的脚本:

./new-test.sh
Run Code Online (Sandbox Code Playgroud)

作为提示,最好使用:

 cd ... || exit
Run Code Online (Sandbox Code Playgroud)

万一出现故障。


配置您的编辑器,使其使用 Linux 格式来保存文件(如果可以)或在 bash 中使用编辑器,例如nano

在此处输入图片说明

  • `dir=foo` 基本上是安全的,除非它包含文字空白。glob 扩展不会发生在变量赋值上。你真正应该使用引号的地方是 `cd "$dir"`。(另外,我刚刚检查过,根据 `echo "$ foo" | hexdump -C`。所以引用不会保护变量定义免受未来编辑中尾随 CR 的影响,而且 `\r` 不是用于分词的空格字符。) (2认同)

αғs*_*нιη 11

另一种选择是使用dos2unix命令将文件转换为 Unix 类型格式。

用法:

dos2unix your_file
Run Code Online (Sandbox Code Playgroud)