Shell脚本:知道何时有重定向输入

pzfprimi  于 2022-11-25  发布在  Shell
关注(0)|答案(2)|浏览(154)

我试图找出一种方法,让shell脚本知道什么时候输入被重定向,以便用不同的命令行参数运行python脚本。我的shell脚本名为P2,可能的调用需要是(不幸的是,这方面没有灵活性):

1. P2
2. P2 < someFile
3. P2 someFile

并且理想情况下,shell脚本伪代码的工作方式如下:

if argCount == 2:
  run (python P2.py someFile)
else:
  if inputWasRedirected: **********_issue is here_**********
    run (python P2.py < someFile)
  else:
    run (python P2.py)

任何帮助都将不胜感激。

ybzsozfc

ybzsozfc1#

#!/bin/sh

if test -n "$1"; then
    echo "Your input is : $1";
elif test ! -t 0; then
    echo "Read from stdin"
    input=$(cat)
    echo your input is :  $input;
else
    echo "No data provided..."
fi

正如您所看到的Check if no command line arguments and STDIN is empty,主要技巧如下:

  • 通过test -n $1来检测是否有参数,test -n $1检查第一个参数是否存在。
  • 然后,使用test ! -t 0检查终端上的stdin是否未打开(因为它通过管道连接到文件)(检查文件描述符零(aka stdin)是否未打开)。
  • 最后,所有其他内容都属于最后一种情况(未提供数据...)。
ql3eal8s

ql3eal8s2#

如果python脚本编写正确,就不需要处理任何事情,只需将脚本参数("$@")传递给python即可:

#!/bin/sh
python P2.py "$@"

"$@"扩展到为shell脚本提供的所有参数(包括在未提供参数时扩展为空)。
Python也继承了shell的任何stdin重定向。
这取决于python脚本选择文件参数而不是stdin(传统行为)。
例如,test,使用cat代替python:

#!/bin/sh
cat "$@"
  • 对于./test a b < c,将打印文件ab
  • 对于./test < c,打印文件c
  • 对于./test,cat从终端读取输入。

相关问题