代码之家  ›  专栏  ›  技术社区  ›  Idan

Shell脚本-Linux

  •  2
  • Idan  · 技术社区  · 16 年前

    我写了这样的东西:

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

    我的问题是:

    1. 为什么不呢 ls -t *"$1"*| head -1 | tail -f 工作?

    2. 有更好的方法吗?

    4 回复  |  直到 16 年前
        1
  •  6
  •   theomega    16 年前

    1:第一行是所谓的佘邦,看描述 here :

    hashbang、hashpling、pound bang或 作为文本文件的第一行。在一个 类Unix操作系统 这两个字符表示 文件是脚本,并尝试 使用 文件中的第一行

    2: tail 无法从stdin获取文件名:它可以将stdin上的文本或文件作为参数。看到了吗 man page 为了这个。

    3:我想不出更好的解决方案:注意包含空格的文件名:这不适用于您当前的解决方案,您需要在 $() 阻止。

        2
  •  2
  •   Marc Schütz    16 年前

    $1 $0 . 但是,它可以包含路径,因此您应该使用:

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

    你也必须使用 ls -rt 首先获取最旧的文件。

        3
  •  0
  •   wRAR    16 年前

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

        4
  •  0
  •   gareth_bowles    16 年前

    根据@theomega在评论中的回答和@Idan的问题,she bang是需要的,因为一些UNIX/Linux系统有不止一个命令shell。

    ./myscript.sh
    

    /bin/sh ./myscript.sh
    

    请注意,she bang还可以用于用非shell语言(如Perl)编写的脚本中;如果你把

    #!/usr/bin/perl
    

    在你剧本的顶端。