终端被我的 .sh 字符编码吓坏了。我能做什么?

The terminal is freaking out with my .sh character encoding. What can I do?

我有这个 SH 文件:

echo "KILLING OLD SERVER SESSION"
kill $(cat lastPID.txt)
sleep 10
echo "STARTING SERVER..."
java -jar my.cute.little.server.jar </dev/null>/dev/null 2>&1 &
echo $! > lastPID.txt
echo "SERVER STARTED! PID:" $(cat lastPID.txt)

这将创建一个新进程,将其 PID 存储在一个 txt 文件中,以便稍后可以在启动其他进程之前关闭它。代码有效,这不是问题。

问题是,当我将它从我的 PC 复制到服务器(使用 filezilla)并 运行 它时,我得到以下信息:

KILLING OLD SERVER SESSION
restart_server.sh: 2: kill: Illegal number:
sleep: invalid time interval `10\r'
Try `sleep --help' for more information.
STARTING SERVER...
: not foundver.sh: 5: restart_server.sh:
SERVER STARTED! PID:

Notepad++ 声明我正在使用 UTF-8 w/o BOM:

$ file restart_server.sh
restart_server.sh: ASCII text, with CRLF line terminators
$ file --mime-encoding restart_server.sh
restart_server.sh: us-ascii

那么,我在这里受到的惩罚是什么罪?我错过了什么?

谢谢!

反引号不是字符串引号。他们 运行 他们的内容作为命令,然后用输出替换自己。您想要字符串的单引号或双引号。

所以

sleep `10`

出错,因为 10 不是命令,然后 sleep 没有参数,等等

同样

echo `$! > lastPID.txt`

正在尝试将 运行 $! > lastPID.txt 作为一个命令,这将创建一个空的 lastPID.txt 文件然后出错,因为 pid 不是一个命令。然后 echoecho 空字符串。

你想要

sleep 10
sleep '10'
sleep "10"

echo "$!" > lastPID.txt

还有其他类似的变化。

您还需要使用 Unix 换行符(而不是 DOS 换行符)保存文件。编码本身并不重要(尽管 UTF-8 通常是一个不错的选择)但您 想要 BOM。