Carriage-returns 在后台 运行 `tail -f` 而在前台 运行 `docker exec -it` 时不适用
Carriage-returns are not applied when running `tail -f` in the background while running `docker exec -it` in the foreground
当我在后台 运行 tail -f
和在前台 docker exec -it
时,tail-command 的输出已损坏。
例如,当我运行执行以下命令时:
$ tail -f log.txt &
$ docker exec -it my-container /bin/bash
我将以下 3 行附加到 log.txt:
cat
dog
bird
然后我得到以下奇怪的输出:
root@4083b121d1793:~# cat
dog
bird
注意换行符。
我猜马车 returns 没有应用。
为什么会出现这种奇怪的行为?
有什么解决办法吗?
更新
版本:
- Docker Mac 3.2.1
桌面
- Docker 引擎 20.10.5
这似乎是因为在 docker/cli 源代码中调用了 MakeRaw() in the docker CLI. The docs explain that the function turns the file descriptor (stdin) into "raw mode" so it can be restored to its original state once the terminal session ends. These function calls all happen when setting up the interactive exec session in the CLI in hijack.go。
This 是源代码中发生的地方。从这里可以看出,如果设置了NORAW
环境变量,则得到正常的输出:
// SetRawTerminal sets raw mode on the input terminal
func (i *In) SetRawTerminal() (err error) {
if os.Getenv("NORAW") != "" || !i.commonStream.isTerminal {
return nil
}
i.commonStream.state, err = term.SetRawTerminal(i.commonStream.fd)
我是这样测试的,当 运行 执行命令时设置变量 NORAW
:
1 号航站楼:
$ tail -f log.txt
$ NORAW=1 docker exec -it containername /bin/bash
root@docker:/work$
2 号航站楼:
$ echo -e "something\nto\ntest" >> log.txt
返回 1 号航站楼:
root@docker:/work$ something
to
test
我完全重现了您之前的内容,但我碰巧在 Windows 和 WSL2 中进行了测试。
但是,设置 NORAW
后,您将不会像往常一样恢复到原始终端会话。在 ^D
或 exit
之后,您将立即将最后一个终端提示粘贴到光标所在的位置:
root@docker:/work$ $
^ docker prompt ^ original terminal prompt session
当我在后台 运行 tail -f
和在前台 docker exec -it
时,tail-command 的输出已损坏。
例如,当我运行执行以下命令时:
$ tail -f log.txt &
$ docker exec -it my-container /bin/bash
我将以下 3 行附加到 log.txt:
cat
dog
bird
然后我得到以下奇怪的输出:
root@4083b121d1793:~# cat
dog
bird
注意换行符。 我猜马车 returns 没有应用。
为什么会出现这种奇怪的行为? 有什么解决办法吗?
更新
版本:
- Docker Mac 3.2.1 桌面
- Docker 引擎 20.10.5
这似乎是因为在 docker/cli 源代码中调用了 MakeRaw() in the docker CLI. The docs explain that the function turns the file descriptor (stdin) into "raw mode" so it can be restored to its original state once the terminal session ends. These function calls all happen when setting up the interactive exec session in the CLI in hijack.go。
This 是源代码中发生的地方。从这里可以看出,如果设置了NORAW
环境变量,则得到正常的输出:
// SetRawTerminal sets raw mode on the input terminal
func (i *In) SetRawTerminal() (err error) {
if os.Getenv("NORAW") != "" || !i.commonStream.isTerminal {
return nil
}
i.commonStream.state, err = term.SetRawTerminal(i.commonStream.fd)
我是这样测试的,当 运行 执行命令时设置变量 NORAW
:
1 号航站楼:
$ tail -f log.txt
$ NORAW=1 docker exec -it containername /bin/bash
root@docker:/work$
2 号航站楼:
$ echo -e "something\nto\ntest" >> log.txt
返回 1 号航站楼:
root@docker:/work$ something
to
test
我完全重现了您之前的内容,但我碰巧在 Windows 和 WSL2 中进行了测试。
但是,设置 NORAW
后,您将不会像往常一样恢复到原始终端会话。在 ^D
或 exit
之后,您将立即将最后一个终端提示粘贴到光标所在的位置:
root@docker:/work$ $
^ docker prompt ^ original terminal prompt session