通过inputredirect将parameter passing给Bash Shell脚本(<)

所以,我需要编写一个接受文件path作为参数的shell脚本,并在shell脚本中使用它。 我知道我可以做这样的事情:

$ ./script filename 

有了这个解决scheme,这将使我可以在shell脚本中使用$1来访问这个文件名string。

但是,我想知道是否有可能使用inputredirect,所以我可以通过使用它的文件名:

 $ ./script < filename 

如果是这样,我将如何在shell脚本中访问这个文件名?
我相当新的shell脚本编码,所以我不知道这是甚至可能的。

您可以使用<通过列表/proc/<pid>/fd目录来提取文件的名称,如下所示:

 ls -ltr /proc/$$/fd 

然后

 $ cat myscript.sh ls -ltr /proc/$$/fd $ ./myscript.sh < hello total 0 lr-x------ 1 ug 64 Feb 25 08:42 255 -> /tmp/myscript.sh lrwx------ 1 ug 64 Feb 25 08:42 2 -> /dev/pts/0 lrwx------ 1 ug 64 Feb 25 08:42 1 -> /dev/pts/0 lr-x------ 1 ug 64 Feb 25 08:42 0 -> /tmp/hello 

我不能猜测这是否有用

当输入通过管道传递时不起作用

 $ cat hello| ./myscript.sh total 0 lr-x------ 1 up 64 Feb 25 08:50 255 -> /tmp/myscript.sh lrwx------ 1 up 64 Feb 25 08:50 2 -> /dev/pts/0 lrwx------ 1 up 64 Feb 25 08:50 1 -> /dev/pts/0 lr-x------ 1 up 64 Feb 25 08:50 0 -> pipe:[82796] 

或者,您可以使用lsof和一些行处理来提取值

  filename=$(/usr/sbin/lsof -p $$| grep " 0u"| cut -c 60-) 

./script < filename的情况下不能访问filename ./script < filename ,只能访问它的内容。 原因是shell打开filename并将相应的文件描述符设置为./script的标准输入。

使用第二种解决方案,您不访问文件名,但脚本的标准输入来自文件。

用第一个解决方案打印文件看起来像这样:

 cat "$1" 

第二个:

 while read line; do echo "$line"; done