问题陈述
我在 Windows 上,有时想在 docker 容器内执行命令,但是无法执行这些命令并出现错误<command>\r: command not found
。例如:
$ docker run --interactive ubuntu:22.04
ls
/bin/bash: line 1: $'ls\r': command not found
可能的解决方案?
- 是否可以在 Windows 版 Git 中配置行尾字符?我找不到它
- 或者也许解决方案在于删除
\r
容器 bash 的标准输入中的所有字符,例如类似这样的内容
docker run --interactive ubuntu:22.04 "bash" "-c" "sed 's/\r//g' | bash"
但我无法让它工作。它几乎可以工作,但并不完全,因为直到交互式会话断开连接时才会打印输出。它也似乎过于复杂。
从更广泛的角度来看,我不明白为什么这是一个问题一些容器,但不是全部。
我尝试过的方法
我在 Git for Windows 提供的终端以及 vscode 的集成终端中都遇到了这个问题。
即使我将
ls<LF>
其粘贴到剪贴板上,仍然会出现相同的错误。请注意,这个问题与这,因为我遇到了同样的问题,但是处于交互模式。
作为一种解决方法,我将其附加
#
到每一行(有效地做出\r
注释),但这很费力并且不灵活。
答案1
\r
您可以使用以下命令将 shell 设置为忽略 Windows 行尾(跳过):
set -o igncr
您也可以将其定义SHELLOPTS
为 Windows 环境变量并将其设置为igncr
。这样,每个 bash 实例都会继承此选项。
答案2
我有一个简单的解决方案来解决您的奇怪问题:(A)您想要的任何命令都应该以“;”终止:空格 分号 空格. (B) 您甚至可能考虑echo DONE
在最后使用命令。
$ docker run --interactive ubuntu:22.04
ls ;
<<ls output here>>
/bin/bash: line 1: $' \r': command not found
$ docker run --interactive ubuntu:22.04
echo EXECUTING ; pwd ; ls ; echo DONE
<<echo output here : EXECUTING>>
<<pwd output here>>
<<ls output here>>
<<echo output here : DONE\r>>