有人可能想在任务计划程序中使用 Windows 上的 Bash,或者将其用作版本控制挂钩脚本。是否可能或支持?
如果不是,为什么?这是一个错误还是防止某些问题的措施?
有人可能想在任务计划程序中使用 Windows 上的 Bash,或者将其用作版本控制挂钩脚本。是否可能或支持?
如果不是,为什么?这是一个错误还是防止某些问题的措施?
使用@3d1t0r 的解决方案,但也可以通过管道传输到cat
wsl bash -c "man bash | cat" # noninteractive; streams the entire manpage to the terminal
wsl bash -c "man bash" # shows me the first page, and lets me scroll around; need to hit `q` to exit
如果交互模式很好,bash -c
通常是多余的
wsl man bash # same behavior as `wsl bash -c "man bash"`
上面的示例可能并不完全清楚,但man
正在根据它所连接的内容改变其行为。
man
让我滚动浏览,以便我以舒适的阅读速度阅读页面。man
将整个联机帮助页转储到控制台,让我没有时间阅读任何内容。“但是等等,”我听到你问,“man cat
ting 手册页不是因为你要求的吗?我在那儿看到了—— man bash | cat
”
不,man
不知道是什么cat
。它只是获得有关 STDOUT 是否连接到交互式终端的提示。
这是一个不同的例子,它始终如一cat
:
wsl bash -c "echo hey | grep --color e" # colors 'e' red
wsl bash -c "echo hey | grep --color e | cat" # colors disappear, what gives?
现在这两个示例都在流式传输它们的输出,但第二个示例公然无视我的--color
标志。
这里的共同点是man
,grep
两者的行为都取决于他们是否认为他们的输出将被某个地方的人通过管道读取。
自动检测交互性的其他常用命令包括ls
和git
。通常,行为更改将涉及输出分页或颜色(存在其他变体)。
I mean seriously, why are humans so slow and chatty?
基于 STDOUT 是否连接到交互式终端的自动行为切换使所有这些用例通常“正常工作”。
在我的用例和@bahrep 的用例中,交互模式对于无监督脚本(例如,由任务调度程序启动)尤其不利。我猜@bahrep 的预定运行挂在less
被调用并等待人工输入。
出于某种原因,wsl
从任务调度程序启动的 - 驱动脚本会给底层脚本错误的提示——它们暗示最终输出附加到交互式终端。
理想情况下,wsl
从执行环境的 windows 端知道它是否被交互调用,并传递正确的提示。然后我就可以跑了wsl [command]
。在这种情况发生之前,我需要使用wsl bash -c "[command] | cat"
它作为一种解决方法。
如果我正确理解了您的问题,那么该-c
选项就是您要寻找的。它允许您直接调用 Linux 命令。
例如,打开 bash 的手册页(也许是为了了解该-c
选项):
bash -c "man bash"
注意:如果您转义任何空格(例如bash -c man\ bash
),您可以省略引号,但通常只使用引号更容易,因为第一个未转义的空格将丢失您的命令的其余部分。
egbash -c man bash
将被解释为bash -c man
.