Нашел решение самостоятельно :)
./telnet.sh | telnet > /tmp/top.txt
Таким образом я перенаправляю команду в выходной файл. Однако мне приходится запускать один и тот же скрипт много раз, и я не хочу перезаписывать один и тот же файл, а хочу создать инкрементный файл (хорошая идея - переименовать его с помощью команды DATE).
использовать опцию даты
./telnet.sh | telnet > /tmp/top-$(date +%Y%m%d-%T).txt
Вы путаете скрипты и функции.
Сценарий — это отдельная программа. Он может быть написан на zsh, но вы можете вызвать его откуда угодно, а не только из командной строки zsh. Если вам случится запустить сценарий, написанный на zsh, из командной строки zsh или другого сценария zsh, это совпадение не повлияет на поведение сценария. Скрипт работает в своем собственном процессе, он не влияет на своего родителя (, например. он не может изменять переменные или текущий каталог ).
Ваш код выполняет автономную задачу, которая может быть вызвана из любого места и не нуждается в доступе к состоянию оболочки, которая его запускает, поэтому это должен быть сценарий, а не функция.
Сценарий должен быть исполняемым файлом:chmod +x /path/to/script
. Он должен начинаться со строки shebang , чтобы ядро знало, какую программу использовать для интерпретации сценария. В вашем случае добавьте эту строку в начало файла:
#!/usr/bin/env zsh
Поместите файл в каталог, указанный в переменной $PATH
. Многие системы устанавливают либо ~/bin
, либо ~/.local/bin
по умолчанию для пользователя PATH
, так что вы можете использовать их. Если вы хотите добавить другой каталог, см.http://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path
Когда вы вводите имя команды, которое не является псевдонимом, функцией или встроенной функцией, оболочка ищет исполняемый файл с таким именем в $PATH
и выполняет его. Таким образом, вам не нужно объявлять скрипт в оболочке, вы просто помещаете его в нужное место.
Функция — это код, который выполняется внутри существующего экземпляра оболочки. Он имеет полный доступ ко всем переменным состояния :оболочки, текущему каталогу, функциям, истории команд и т. д. Вы можете вызывать функцию только в совместимой оболочке.
Ваш код может работать как функция, но вы ничего не выигрываете, превращая его в функцию, и теряете возможность вызывать его откуда-то еще (, например. из файлового менеджера ).
В зш,вы можете сделать функцию доступной для интерактивных сеансов, включив ее определение в ~/.zshrc
. В качестве альтернативы, чтобы не загромождать .zshrc
очень большим количеством функций, вы можете использовать механизм автозагрузки. Автозагрузка работает в два этапа:
autoload -U myfunction
. myfunction
вызывается в первый раз, zsh ищет файл с именем myfunction
в каталогах, перечисленных в $fpath
, и использует первый найденный файл в качестве определения myfunction
. Все функции должны быть определены перед использованием. Вот почему недостаточно поместить файл в $fpath
. Объявление функции с помощью autoload
фактически создает определение заглушки, в котором говорится: «Загрузите эту функцию из $fpath
и повторите попытку» :
% autoload -U myfunction
% which myfunction
myfunction () {
# undefined
builtin autoload -XU
}
В Zsh есть механизм для создания этих заглушек путем изучения $fpath
. Он встроен в подсистему завершения.
#autoload
в качестве первой строки файла. .zshrc
убедитесь, что вы полностью установили fpath
перед вызовом функции инициализации системы завершения compinit
. Обратите внимание, что файл, содержащий определение функции, должен содержать тело функции , а не определение функции, потому что то, что zsh выполняет при вызове функции, является содержимым файла. Итак, если вы хотите поместить свой код в функцию, вы должны поместить его в файл с именем extract
, который находится в одном из каталогов на $fpath
, содержащем
#autoload
if [ -f $1 ]; then
…
Если вы хотите, чтобы код инициализации выполнялся при загрузке функции, или для определения вспомогательных функций, вы можете использовать эту идиому (, используемую в дистрибутиве zsh ). Поместите в файл определение функции, а также все вспомогательные определения и любой другой код инициализации. В конце вызовите функцию, передав аргументы. Тогда myfunction
будет содержать:
#autoload
my_auxiliary_function () {
…
}
myfunction () {
…
}
myfunction "$@"
7z x
работает с большинством типов архивов.
Есть несколько способов решить эту проблему: