linux - bash 命令截断

标签 linux bash centos

我有一个包含内容的 bash 文件

cd /var/www/path/to/folder
git pull

当我运行它时,我得到了

: No such file or directorywww/path/to/folder
' is not a git command. See 'git --help'.

Did you mean this?
        pull

知道为什么 bash 会得到截断版本的命令吗?

最佳答案

您的 bash 脚本中有回车符(Windows 文本文件行结尾)。删除它们。

bash 文件在 hexdump -C 下应该如下所示:

00000000  63 64 20 2f 76 61 72 2f  77 77 77 2f 70 61 74 68  |cd /var/www/path|
00000010  2f 74 6f 2f 66 6f 6c 64  65 72 0a 67 69 74 20 70  |/to/folder.git p|
00000020  75 6c 6c 0a                                       |ull.|
00000024

但是你的看起来像这样:

00000000  63 64 20 2f 76 61 72 2f  77 77 77 2f 70 61 74 68  |cd /var/www/path|
00000010  2f 74 6f 2f 66 6f 6c 64  65 72 0d 0a 67 69 74 20  |/to/folder..git |
00000020  70 75 6c 6c 0d 0a                                 |pull..|

注意 0a 前面的额外 0d(十六进制 0D = 十进制 13 = ASCII 回车,ANSI \r) s(十六进制 0A = 十进制 10 = ASCII 换行符,ANSI \n,bash 将其视为行尾)。

回车符在 bash 中不是空格,因此它被视为命令行最后一个参数的一部分。您收到错误是因为文件夹 /var/www/path/to/folder.git\r 不存在并且 pull\r 不是有效的 git 子命令。

打印时,回车会将光标移动到行首,这就是错误消息看起来不对的原因。 Bash 和 git 正在打印类似 foo.bash: line 1: cd:/www/path/to/folder\r: No such file or directorygit: 'pull\r'不是 git 命令。请参阅“git --help”,但在 \r 将光标移动到行首后,每条消息的尾端会覆盖其开头。

有一个名为 dos2unix 的程序可以将文本文件从 DOS 转换为 Unix:

dos2unix filename >newfilename

但这种转换实际上只包含删除回车符,您也可以使用 tr 明确地执行此操作:

tr -d '\r' <filename >newfilename

关于linux - bash 命令截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27162343/

相关文章:

regex - 带正则表达式的 Linux 命令行 Zip

centos - 安装 automake 1.14 时,glib2 build 找不到 automake 1.13

http - 在 HAProxy 上重定向

c - 什么是 intel 机器中的 VIctim 缓存?我们可以禁用它吗?

linux - 使用 oracle linux 5.9 在 oracle 11g 中发送电子邮件时出错

regex - 如何从文件中复制正则表达式匹配项?需要从日志文件中获取所有 MAC 地址

linux - 为 ping ssh 端口添加超时?

linux - 删除日志文件中的重复行

bash - 我如何回显/打印来自 bash 变量的特定行

centos - 通过脚本安装包