2014-02-25 60 views
2

因此,我需要编写一个接受文件路径作为参数的shell脚本,并在shell脚本中使用它。我知道我可以做这样的事情:通过输入重定向将参数传递给Bash Shell脚本(<)

$ ./script filename 

通过这一解决方案,这将让这个我可以访问在shell脚本中使用$1这个文件名字符串。

不过,我想知道是否可以使用输入重定向代替,所以我可以通过使用它的文件名:

$ ./script < filename 

如果是这样,我怎么会在shell脚本访问此文件名?
我对shell脚本编码相当陌生,所以我不确定这是否可能。

回答

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

不错的一个,没有想到...不知道这是否便携,但整齐的把戏都是一样的...来想一想,同样可以实现解析'lsof -p $$'的输出' 。 – isedev

+1

和'command | 。/ script'会是一个有趣的边缘情况... – isedev

+1

@isedev谢谢你,'lsof -p $$'似乎更具可移植性。使用lsof来跟踪管道也是可能的,但它似乎与基本情况一样没用 –

1

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

与第一溶液打印文件应该是这样的:

cat "$1" 

随着第二:

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

应该是'而IFS =读-r线;',而你还缺少约$线引号('回声“$ line”')。 –

2

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

相关问题