Shell脚本 - Linux

时间:2010-03-04 15:47:03

标签: linux shell scripting

我想写一个非常简单的脚本,它接受一个进程名称,并返回包含进程名称的最后一个文件名的尾部。

我写了类似的东西:

#!/bin/sh
tail $(ls -t *"$1"*| head -1) -f

我的问题:

  1. 我需要第一行吗?

  2. 为什么ls -t *"$1"*| head -1 | tail -f无效?

  3. 有更好的方法吗?

4 个答案:

答案 0 :(得分:6)

1:第一行是所谓的she-bang,请阅读说明here

  

在计算中,一个shebang(也称为a   hashbang,hashpling,pound bang,或   crunchbang)指的是人物   “#!”当他们是前两个   解释器指令中的字符   作为文本文件的第一行。在一个   类Unix操作系统   程序加载器需要存在   这两个字符作为指示   该文件是一个脚本,并尝试   使用。执行该脚本   由其他人指定的翻译   文件中的第一行

2:tail无法从stdin获取文件名:它可以将stdin上的文本或文件作为参数。请参阅man page

3:没有更好的解决方案出现在我的脑海中:注意包含空格的文件名:这不适用于您当前的解决方案,您需要在$()块周围添加引号。

答案 1 :(得分:2)

$1包含第一个参数,进程名称实际位于$0中。但是,这可以包含路径,因此您应该使用:

#!/bin/sh
tail $(ls -rt *"`basename $0`"*| head -1) -f

您还必须先使用ls -rt来获取最早的文件。

答案 2 :(得分:0)

继续@theomega的回答和评论中的@Idan的问题之后,除了其他方面之外,还需要一些UNIX-Linux系统,因为有些UNIX / Linux系统有多个命令shell。

每个命令shell都有不同的语法,因此she-bang提供了一种指定应该使用哪个shell来执行脚本的方法,即使您没有在运行命令中通过键入(例如)< / p>

./myscript.sh

而不是

/bin/sh ./myscript.sh

请注意,she-bang也可用于以非shell语言编写的脚本,例如Perl;在你放

的情况下
#!/usr/bin/perl

位于脚本的顶部。

答案 3 :(得分:0)

如果从shell运行脚本,则可以省略shebang,在这种情况下,内容将由当前的shell实例执行。在许多情况下,这不会造成任何问题,但这仍然是一种不好的做法。