我想写一个非常简单的脚本,它接受一个进程名称,并返回包含进程名称的最后一个文件名的尾部。
我写了类似的东西:#!/bin/sh
tail $(ls -t *"$1"*| head -1) -f
我的问题:
我需要第一行吗?
为什么ls -t *"$1"*| head -1 | tail -f
无效?
有更好的方法吗?
答案 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实例执行。在许多情况下,这不会造成任何问题,但这仍然是一种不好的做法。