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

Bry*_*ere 2 linux bash shell

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

$ ./script filename
Run Code Online (Sandbox Code Playgroud)

使用此解决方案,这将使我能够$1在shell脚本中使用此文件名字符串.

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

$ ./script < filename
Run Code Online (Sandbox Code Playgroud)

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

Rau*_*res 5

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

ls -ltr /proc/$$/fd
Run Code Online (Sandbox Code Playgroud)

然后

$ 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
Run Code Online (Sandbox Code Playgroud)

我猜不出这是否有用

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

$ 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]
Run Code Online (Sandbox Code Playgroud)

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

 filename=$(/usr/sbin/lsof -p $$| grep " 0u"| cut -c 60-)
Run Code Online (Sandbox Code Playgroud)

  • filename =`/ usr/sbin/lsof -p $$ | grep"0u"cut -c 60-`适合我 (2认同)