Shell Script - Linux - PullRequest
       8

Shell Script - Linux

2 голосов
/ 04 марта 2010

Я хочу написать очень простой скрипт, который принимает имя процесса и возвращает хвост последнего имени файла, содержащего имя процесса.

Я написал что-то подобное:

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

Мой вопрос:

  1. Нужна ли первая строка?

  2. Почему ls -t *"$1"*| head -1 | tail -f не работает?

  3. Есть ли лучший способ сделать это?

Ответы [ 4 ]

6 голосов
/ 04 марта 2010

1: первая строка - это так называемая челка, прочитайте описание здесь :

В вычислительной технике, Шебанг (также называемый hashbang, hashpling, pound bang или crunchbang) относится к персонажам "#!" когда они первые два символы в директиве интерпретатора в первой строке текстового файла. В Unix-подобная операционная система, загрузчик программы принимает присутствие эти два символа в качестве указания что файл является скриптом, и пытается выполнить этот скрипт, используя переводчик, указанный остальной частью первая строка в файле

2: tail не может взять имя файла из стандартного ввода: может принимать текст в качестве стандартного ввода или файл. Для этого см. Справочную страницу .

3: лучшего решения мне не приходит в голову: обратите внимание на имена файлов, содержащие пробелы: это не работает с вашим текущим решением, вам нужно добавить кавычки вокруг блока $().

2 голосов
/ 04 марта 2010

$1 содержит первый аргумент, имя процесса на самом деле в $0. Однако это может содержать путь, поэтому вы должны использовать:

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

Вы также должны использовать ls -rt, чтобы сначала получить самый старый файл.

0 голосов
/ 04 марта 2010

Вы можете опустить шебанг, если вы запустите скрипт из оболочки, в этом случае содержимое будет выполняться вашим текущим экземпляром оболочки. Во многих случаях это не вызовет проблем, но это все еще плохая практика.

0 голосов
/ 04 марта 2010

Исходя из ответа @ theomega и вопроса @ Идана в комментариях, она необходима, помимо прочего, потому что некоторые системы UNIX / Linux имеют более одной командной оболочки.

Каждая командная оболочка имеет свой синтаксис, поэтому она дает возможность указать, какую оболочку следует использовать для выполнения сценария, даже если вы не указали ее в своей команде запуска, набрав (например)

./myscript.sh

вместо

/bin/sh ./myscript.sh

Обратите внимание, что она может также использоваться в сценариях, написанных на языках без оболочки, таких как Perl; в случае, если бы вы положили

#!/usr/bin/perl

вверху вашего скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...