Как обнаружить, если введенный от аргумента, файла или терминала

for file in /foo/*
do
  if [ -f "$file" ]
  then
    dd if="$file" of="$file.truncated" bs=31 skip=1 && mv "$file.truncated" "$file"
  fi
done

или быстрее, благодаря предложению Gilles:

for file in /foo/*
    do
      if [ -f $file ]
      then
        tail +32c $file > $file.truncated && mv $file.truncated $file
      fi
    done

Примечание: Хвост Posix указывает "-c +32" вместо "+32c", но хвосту значения по умолчанию Соляриса не нравится он:

   $ /usr/bin/tail -c +32 /tmp/foo > /tmp/foo1
    tail: cannot open input

/usr/xpg4/bin/tail соглашается с обоими синтаксисами.

8
27.06.2011, 14:33
2 ответа

Править: измененный -t кому: -t 0, который действительно правильно обнаруживает вход от терминала или файла.

Я думаю, что ключ здесь знает, прибывает ли Ваш вход из терминала или из файла. Существует тест для этого (man test, посмотрите -t).

Принятие Вы запускаете скрипт удара:

if [ -t 0 ]; then
    echo "Input from terminal"
    if [ $# -eq 0 ]; then
        echo "No input files specified on command line.  Error." >&2
    else
        echo "Input file given on command line.  It is $1"
    fi
else
    echo "Input coming from stdin"
fi

Можно обработать различные сценарии путем замены фактическим кодом в для операторов эха выше.

Обновление, беглый сценарий тестирования:

#!/bin/bash
[ -t 0 ] && echo "t is true" || echo "t is false"

Выполнение:

$ test.sh testfile
t is true
$ test.sh < testfile
t is false
$
13
27.01.2020, 20:09
  • 1
    t всегда оценивает к истинному выполнению сценария из командной строки с < myfile :( –  mschonaker 27.06.2011, 10:28
  • 2
    @mschonaker - Используя -t 0 дает корректные результаты. Обновленный ответ. –  unpythonic 27.06.2011, 10:39
  • 3
    @MarkMann, Что делает 0 ? Каково различие? Это не находится в документации. –  Ivan V. 05.02.2016, 23:47
  • 4
    @IvanV. - Нуль является дескриптором файла для тестирования. Стандартный вход связан с 0, стандартный вывод с 1 и стандартная погрешность с 2. Если бы я хотел проверить, шел ли мой вывод в терминал, я использовал бы [ -t 1 ] –  unpythonic 06.02.2016, 00:16
  • 5
    @MarkMann Благодарит, я думал, что могло бы случиться так что, или некоторая булева проверка. –  Ivan V. 06.02.2016, 13:32

В целом, выражения $1, $2, и т.д. расширьтесь до 1-го, 2-го, и т.д. аргумент, данный на командной строке сценария.

Так, когда Вы вызываете сценарий как:

myscript.sh myfile

затем $1 в рамках сценария расширяется до myfile$2, $3, и т.д. все - пустая строка).

Когда Вы вызываете сценарий как:

myscript < myfile

перенаправление STDIN от myfile сделан родительской оболочкой, таким образом, сценарий на самом деле называют без аргументов и $1 расширяется до пустой строки.

6
27.01.2020, 20:09
  • 1
    Как я обнаруживаю, если названо без аргументов в командной строке (третий случай)? Извините, если Вы ответили перед моим редактированием.Спасибо. –  mschonaker 27.06.2011, 10:18

Теги

Похожие вопросы