Рейтинг:0

Bash: определите функцию в bashrc, которая может использоваться любыми сценариями по всему миру.

флаг kp

Мне нравится определять функцию в ~/.bashrc и использовать его в разных сценариях либо через экспорт -f или же источник .bashrc.

Функция:

нано ~/.bashrc

функция test_func() {
    yt-dlp -f '299+140' --merge-output-format mp4 -cia List.txt;
}

экспорт -f test_func

Сценарий:

#!/бин/баш

cd /home/admn/Загрузки/YT_DL;

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';

Проблема-1:

После test_func, остальная часть команды --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s' вообще не работает.



Проблема-2:

Ранее, когда я пытался использовать источник .bashrc в моем сценарии я получал эти ошибки:

/usr/local/scripts/test.sh: строка 3: .bashrc: нет такого файла или каталога
/usr/local/scripts/test.sh: строка 12: test_func: команда не найдена

Функция (без экспорт -f):

нано ~/.bashrc

функция test_func() {
    yt-dlp -f '299+140' --merge-output-format mp4 -cia List.txt;
}

Сценарий (с источник .bashrc):

#!/бин/баш

источник .bashrc

cd /home/admn/Загрузки/YT_DL;

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';

Редактировать-1:

$ bash -xv /usr/local/scripts/test.sh
#!/бин/баш

источник /home/admn/.bashrc
+ источник /home/admn/.bashrc
# ~/.bashrc: выполняется bash(1) для оболочек без входа в систему.
# см. /usr/share/doc/bash/examples/startup-files (в пакете bash-doc)
# Например

# псевдоним pip='pip3.7'
псевдоним python='python3'
++ псевдоним python=python3

# Если вы не работаете в интерактивном режиме, ничего не делайте
случай $- в
    *и*) ;;
      *) возвращаться;;
эсак
++ случай $- в
++ возврат

test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s';
+ test_func --autonumber-start 101 -o '%(autonumber)1d_%(title)s.%(ext)s'
/usr/local/scripts/test.sh: строка 5: test_func: команда не найдена
$ 

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

https://unix.stackexchange.com/questions/63665/how-to-define-a-bash-function-that-can-be-used-by-other-scripts

https://stackoverflow.com/questions/6218268/how-to-define-a-bash-function-for-use-in-any-script

https://stackoverflow.com/questions/17219174/variables-set-in-bashrc-and-accessing-them-in-shellscript

https://stackoverflow.com/questions/1500499/how-do-you-call-a-function-defined-in-bashrc-from-the-shell

Определите глобально доступную функцию bash, которая будет использоваться любым скриптом.

ОС: Ubuntu MATE 21.04

Bash: 5.1.4(1)-выпуск (x86_64-pc-linux-gnu)

Рейтинг:3
флаг tm

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

функция test_func() {
    yt-dlp "$@" -f '299+140' --merge-output-format mp4 -cia List.txt
    # ~~~~
}

"$@" означает «все параметры», вы также можете использовать позиционные параметры, такие как "$1", "$2", и т.д.

Если вы используете файл из другого каталога, вам нужно либо указать полный путь к нему, либо указать путь к файлу в $ПУТЬ.

источник ~/.bashrc
# или же
ПУТЬ+=:~
источник .bashrc

После обновления: Твой .bashrc содержит возвращаться который прекращает обработку .bashrc если не работает в интерактивной оболочке. Поместите объявление функции где-нибудь перед условием, если вы хотите выполнить его и в неинтерактивных оболочках.

флаг tm
Попробуйте запустить свои сценарии под `set -xv`, чтобы увидеть, какие команды выполняются.
флаг tm
`return` выходит из `.bashrc` до того, как он доберется до объявления функции.
флаг tm
Ваш `.bashrc` содержит `return`, который останавливает обработку `.bashrc`, если он не запущен в интерактивной оболочке. Поместите объявление функции где-нибудь перед условием, если вы хотите выполнить его и в неинтерактивных оболочках.
Jags avatar
флаг kp
функция публикации до того, как условие `return` решило ее. Итак, эта часть `# Если не работает в интерактивном режиме, ничего не делайте | случай $- в | *и*) ;; | *) возвращаться;; | esac` должен идти в конце файла `.bashrc`? Спасибо большое.
Jags avatar
флаг kp
Наконец, существует ли «предпочтительный/стандартный/лучший» способ вызова функции из `.bashrc`? Я имею в виду, `export -f` против `source ~/.bashrc` Спасибо.
флаг tm
Часть «возврат» должна идти перед тем, что вы хотите в интерактивной оболочке, но не хотите в неинтерактивной.
флаг tm
Я не эксперт, но я предпочитаю "исходник" "экспорту".
Jags avatar
флаг kp
Это то, что я читал в нескольких местах, что «источник» предпочтительнее/лучше. Спасибо большое :)

Ответить или комментировать

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