当前位置: 首页 > 面试题库 >

在bash脚本中动态重定向标准输入

公良浩邈
2023-03-14
问题内容

我试图这样做以确定是否将stdin重定向到文件:

[ ...some condition here... ] && input=$fileName || input="&0"
./myScript < $input

但这不起作用,因为当变量$ input为“&0”时,bash会将其解释为文件名。

但是,我可以这样做:

if [ ...condition... ];then
    ./myScript <$fileName
else
    ./myScript

问题在于./myScript实际上是一个长长的命令行,我不想重复,也不想为其创建函数,因为它也不那么长(不值得)。

然后我想到这样做:

[ ...condition... ] && input=$fileName || input=  #empty
cat $input | ./myScript

但这需要再运行一个命令和一个管道(即子外壳)。
还有另一种更简单,更有效的方法吗?


问题答案:

首先stdin是文件描述符0(零)而不是1(stdout)。

您可以复制文件描述符或有条件地使用文件名,如下所示:

[[ some_condition ]] && exec 3<"$filename" || exec 3<&0

some_long_command_line <&3

请注意,exec如果条件为假 第一个exec失败,则所示命令将执行第二个命令。如果您不希望这样做失败,则应使用if/ else

if [[ some_condition ]]
then
    exec 3<"$filename"
else
    exec 3<&0
fi

但是如果第一次重定向失败(在条件为真之后),则随后从文件描述符3进行的重定向将失败。



 类似资料:
  • 问题内容: 是否可以在Python中临时重定向stdout / stderr(即在方法期间)? 编辑: 当前解决方案的问题(我最初记得但后来忘记了)是它们没有 重定向 ;相反,它们只是完全替换了流。因此,如果某个方法由于某种原因(例如,由于将流作为参数传递给某物)而具有该变量的 本地 副本,则该方法将无效。 有什么办法吗? 问题答案: 要解决某些函数可能已将流作为局部变量缓存的问题,因此替换全局变

  • 我在raspberry pi上得到了一个启动时运行的python脚本(运行良好),我想将输出附加到现有的文本文件中。我在我的/etc/rc.local文件中得到了这段代码(我在cron中也尝试了同样的方法,但由于某种原因,它甚至没有启动脚本)。 不幸的是,无论我尝试什么,日志文件总是空的,除非我直接运行同一个命令并通过按ctrl c而不是ctrl z中止脚本。似乎脚本必须以正确的方式关闭,然后才能

  • 问题内容: 谁能解释这种行为?运行: 导致没有输出,而: 产生预期的输出: 管道不应该一步一步地执行第二个示例中对test.file的重定向吗?我对破折号和bash壳都尝试了相同的代码,并且两者的行为相同。 问题答案: 该选项最近添加了一个选项,当停用作业控制时,该选项允许管道中的最后一条命令在当前外壳程序中运行,而不是子外壳程序中运行。 确实会输出

  • 问题内容: 我有一个要在IPython中运行的Python脚本。我想将输出重定向(写入)到文件,类似于: 当我在IPython中运行脚本时如何执行此操作,例如 有一个较旧的页面描述了可以编写的用于执行此操作的函数,但是我相信现在有一种内置的执行方法,我只是找不到。 问题答案: IPython拥有自己的上下文管理器来捕获stdout / err ,但是它不重定向到文件,而是重定向到对象: 并且此功能

  • 问题内容: 我试图删除文件中除最后一行以外的所有行,但是以下命令不起作用,尽管file.txt不为空。 为什么会这样呢? 问题答案: 从文件通过管道重定向回到同一文件是不安全的;如果在开始读取第一阶段之前设置管道的最后阶段时被外壳覆盖,那么最终将得到空输出。 而是执行以下操作: …嗯,实际上,不要在生产代码中这样做;特别是如果您在对安全性敏感的环境中并以root用户身份运行,则以下更合适: 另一种

  • 问题内容: 我的基本程序从脚本GUI.py导入了它的GUI界面。 在我的GUI.py中: 但是它的作用是打开两个窗口,第一个窗口 (顶层 窗口 ) 按预期工作,第二个窗口 处于空闲状态 , 这是期望的,直到我单击某个按钮 ,该 按钮 在连续按下后打印数据,并且打印的数据应出现在第二个窗口的文本小部件中, 但是 不会发生,程序也没有响应,当我关闭“顶层”窗口时,会出现错误消息 “ TclError: