通过输入重定向将参数传递给Bash Shell脚本(<)

时间:2014-02-25 08:35:54

标签: linux bash shell

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

$ ./script filename

使用此解决方案,这将使我可以使用shell脚本中的$1访问此文件名字符串。

但是,我想知道是否可以使用输入重定向,所以我可以使用它传递文件名:

$ ./script < filename

如果是这样,我将如何在shell脚本中访问此文件名?我对shell脚本编码很新,所以我不确定这是否可行。

3 个答案:

答案 0 :(得分:5)

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

ls -ltr /proc/$$/fd

然后

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

我无法猜测这是否有用

当输入通过管道

时,它不起作用
$ cat hello| ./myscript.sh 
total 0
lr-x------ 1 u p 64 Feb 25 08:50 255 -> /tmp/myscript.sh
lrwx------ 1 u p 64 Feb 25 08:50 2 -> /dev/pts/0
lrwx------ 1 u p 64 Feb 25 08:50 1 -> /dev/pts/0
lr-x------ 1 u p 64 Feb 25 08:50 0 -> pipe:[82796]

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

使用第一个解决方案打印文件将如下所示:

cat "$1"

第二个:

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