function
ключевое слово было представлено в ksh. Традиционная Оболочка Bourne только имела foo ()
синтаксис и POSIX стандартизируют только foo ()
синтаксис.
В ATT ksh (но не pdksh), существует несколько различий между функциями, определяемыми function
и функции, определяемые с синтаксисом Границы/POSIX. В функциях, определяемых function
, typeset
ключевое слово объявляет локальную переменную: после того как функция выходит, значение переменной сбрасывается, в какой это прежде вводило функцию. С классическим синтаксисом переменные имеют глобальную область видимости, используете ли Вы typeset
или нет.
$ ksh -c 'a=global; f () { typeset a=local; }; f; echo $a'
local
$ ksh -c 'a=global; function f { typeset a=local; }; f; echo $a'
global
Другое различие в ksh - это функции, определяемые с function
ключевое слово имеет их собственный контекст прерывания. Прерывания, определенные вне функции, проигнорированы при выполнении функции и фатальных ошибок в функциональном выходе только функция а не из целого сценария. Кроме того, $0
имя функции в функции, определяемой function
но сценарий называет в функции, определяемой с ()
.
Pdksh не эмулирует ATT ksh. В pdksh, typeset
создает локально ограниченные по объему переменные независимо от функции, и нет никаких локальных прерываний (хотя с помощью function
действительно имеет некоторые незначительные значения — см. страницу справочника для деталей).
Bash и zsh, представленный function
ключевое слово для совместимости с ksh. Однако в этих оболочках function foo { … }
и foo () { … }
строго идентичны, как удар и zsh расширение function foo () { … }
. typeset
ключевое слово всегда объявляет локальные переменные (кроме с -g
конечно), и прерывания не локальны (можно получить локальные прерывания в zsh путем установки local_traps
опция).
Вы можете сделать это, чтобы предоставить tar
список всех файлов внутри protTests
, кроме тех, которые являются символическими ссылками:
find protTests -maxdepth 1 -mindepth 1 -not -type l -print0 |
tar --null --files-from - -cvf protTests.tar
Между прочим, ваша существующая команда:
tar -cvf protTests.tar protTests/*
не будет архивировать все файлы в protTests
, он будет архивировать только те, чьи имена не начинаются с .
(те, что не скрыты). Оператор *
glob пропускает файлы, имена которых начинаются с .
по дизайну. У команды также есть проблема, заключающаяся в том, что если protTests
имеет много файлов (более многих тысяч), тогда protTests / *
может расширяться до слишком большого количества аргументов, чтобы поместиться в командной строке.
У более простой команды, подобной этой, не будет ни одной из этих проблем:
tar -cvf protTests.tar protTests
Моя реализация tar - лучший метод
star -cv -f out.tar -find protTests ! -type l