我正试图找出一种方法,让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)
我将不胜感激。
#!/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
如您所见,检查是否没有命令行参数和STDIN为空,主要技巧如下:
通过
test -n $1
检查是否存在第一个参数来检测参数。然后,检查stdin是否在终端上未打开(因为它被管道连接到文件)是用
test ! -t 0
完成的(检查文件描述符0(即stdin)是否未打开)。最后,其他的都落在最后一种情况下(没有提供数据…)。
如果python脚本编写正确,则不需要处理任何内容。只需将脚本参数("$@"
)传递给python:
#!/bin/sh
python P2.py "$@"
"$@"
展开为shell脚本的所有参数(包括在没有参数的情况下展开为无参数)。
Python还继承了shell的任何stdin重定向。
这取决于python脚本是否更喜欢文件参数而不是stdin(常规行为)。
。test
,使用cat代替python:
#!/bin/sh
cat "$@"
- 对于
./test a b < c
,打印a
和b
文件。 - 为
./test < c
文件c
打印 - 对于
./test
, cat从终端读取输入