Как сделать пользовательский сценарий zsh исполняемым автоматически?

Нашел решение самостоятельно :)

./telnet.sh | telnet > /tmp/top.txt 

Таким образом я перенаправляю команду в выходной файл. Однако мне приходится запускать один и тот же скрипт много раз, и я не хочу перезаписывать один и тот же файл, а хочу создать инкрементный файл (хорошая идея - переименовать его с помощью команды DATE).

использовать опцию даты

./telnet.sh | telnet > /tmp/top-$(date +%Y%m%d-%T).txt
3
09.03.2018, 14:00
2 ответа

Вы путаете скрипты и функции.

Создание сценария

Сценарий — это отдельная программа. Он может быть написан на 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очень большим количеством функций, вы можете использовать механизм автозагрузки. Автозагрузка работает в два этапа:

  1. Объявите имя функции с помощью autoload -U myfunction.
  2. Когда 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работает с большинством типов архивов.

12
27.01.2020, 21:10

Есть несколько способов решить эту проблему:

  • вы можете поместить эту функцию в свой.zshrc;
  • вы можете получить свой сценарий;
  • вы можете поместить код вашей функции непосредственно в файл с именем Extract в каталоге, который находится в вашем PATH.
1
27.01.2020, 21:10

Теги

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