所以,我需要编写一个shell脚本,它接受一个文件路径作为参数,并在shell脚本中使用它。我知道我可以做类似的事情:
$ ./script filename
使用此解决方案,这将使我可以使用shell脚本中的$1
访问此文件名字符串。
但是,我想知道是否可以使用输入重定向,所以我可以使用它传递文件名:
$ ./script < filename
如果是这样,我将如何在shell脚本中访问此文件名?我对shell脚本编码很新,所以我不确定这是否可行。
答案 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