1

有人可能想在任务计划程序中使用 Windows 上的 Bash,或者将其用作版本控制挂钩脚本。是否可能或支持?

如果不是,为什么?这是一个错误还是防止某些问题的措施?

4

2 回答 2

1

使用@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 catting 手册页不是因为你要求的吗?我在那儿看到了—— 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标志。

这里的共同点是mangrep两者的行为都取决于他们是否认为他们的输出将被某个地方的人通过管道读取。

自动检测交互性的其他常用命令包括lsgit。通常,行为更改将涉及输出分页或颜色(存在其他变体)。

  • 分页对人类来说很好,因为人类通常无法以流输出的速度阅读。
  • 分页对机器人不利,因为当您只能使用缓冲流时,分页会产生大量协议开销。I mean seriously, why are humans so slow and chatty?
  • 颜色对人类来说很好,因为我们喜欢额外的视觉提示来帮助视觉区分。
  • 颜色不适合流式传输到文件,因为您的文件将充满 ansi 颜色代码垃圾,大多数文本编辑器都不能很好地显示。

基于 STDOUT 是否连接到交互式终端的自动行为切换使所有这些用例通常“正常工作”。

重述原始问题

在我的用例和@bahrep 的用例中,交互模式对于无监督脚本(例如,由任务调度程序启动)尤其不利。我猜@bahrep 的预定运行挂在less被调用并等待人工输入。

出于某种原因,wsl从任务调度程序启动的 - 驱动脚本会给底层脚本错误的提示——它们暗示最终输出附加到交互式终端。

理想情况下,wsl从执行环境的 windows 端知道它是否被交互调用,并传递正确的提示。然后我就可以跑了wsl [command]。在这种情况发生之前,我需要使用wsl bash -c "[command] | cat"它作为一种解决方法。

于 2020-08-22T22:21:41.377 回答
0

如果我正确理解了您的问题,那么该-c选项就是您要寻找的。它允许您直接调用 Linux 命令。
例如,打开 bash 的手册页(也许是为了了解该-c选项):

bash -c "man bash"

注意:如果您转义任何空格(例如bash -c man\ bash),您可以省略引号,但通常只使用引号更容易,因为第一个未转义的空格将丢失您的命令的其余部分。
egbash -c man bash将被解释为bash -c man.

于 2017-09-22T23:55:48.757 回答