所以,我需要编写一个接受文件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