Как сделать так, чтобы функция zsh позволяла вводить строку без кавычек, но при этом интерпретировалась с кавычками?

Вы можете использовать find -exec...для замены в однострочном -сценарии оболочки.

find. -name "*.mp3" -type f -exec bash -c 'mv "$1" "${1/pronunciation_de_}"' bash {} \;

Имя файла {}передается в качестве параметра $1выполняемому процессу bash, и ${1/pronunciation_de_}использует возможности расширения параметров bash и заменяет первое вхождение pronunciation_de_в $1с пустой строкой.

Дополнительный параметр -type fобеспечивает соответствие только обычным файлам.

0
02.05.2021, 00:41
2 ответа

как сказал Кусалананда, noglobэто путь; вы можете определить свою функцию как есть, а затем использовать alias, чтобы включитьnoglob:

downloadyoutube(){
  youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "$1"
}
alias downloadyoutube="noglob downloadyoutube"

В любом случае, то, что вы пытаетесь сделать с этими аргументами, спорно:youtube-dlпо умолчанию уже много лет; читать текущую manстраницу!


Я хотел бы подчеркнуть, что Кусалананда прав:

  1. вам даже нужно ', не только ", здесь, чтобы вы не хотели, чтобы несколько специальных символов стали проблемами,
  2. даже отключение подстановки не помогает против символов события/перенаправления; поскольку каждый URL-адрес Youtube будет содержать &, вам лучше просто настроить свою оболочку для автоматической замены вставленного &в строке (не в конце строки )на \&; мой zsh делает это автоматически, и я думаю, что в этом виноват -мой -zsh.
1
28.07.2021, 11:35

Вероятно, у вас возникла проблема, о которой вы на самом деле не упомянули: оболочка zshпо умолчанию выдает ошибку, если шаблон подстановки имени файла не соответствует ни одному имени:

$ downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
zsh: no matches found: https://www.youtube.com/watch?v=_OBlgSz8sSM

URL здесь содержит символ ?, который является подстановочным символом. Это побуждает оболочку выполнить подстановку имени файла, используя URL-адрес в качестве шаблона. Совпадение не найдено, поэтому оболочка жалуется и даже не пытается вызвать вашу функцию.

Аналогичное поведение наблюдается в оболочке bash, если установлен параметр оболочки failglob:

$ shopt -s failglob
$ downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
bash: no match: https://www.youtube.com/watch?v=_OBlgSz8sSM

Вы можете запретить оболочке использовать URL-адрес в качестве шаблона подстановки, установив параметр оболочки NOGLOBс помощью setopt NOGLOB. Это отключает подстановку в текущем сеансе оболочки, пока вы не используете unsetopt NOGLOB.

Вы также можете добавить к вызову функции префикс noglob, что приведет к установке параметра оболочки NOGLOBдля одной команды:

noglob downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM

Тем не менее, наиболее разумный подход заключается в заключении URL-адреса в одинарные кавычки при вызове функции. URL-адреса вполне могут содержать другие символы, которые являются специальными для оболочки и которые не являются не подстановочными символами, например, &, что вводит фоновое задание. URL-адрес с &в нем нельзя было бы использовать без кавычек, даже если универсализация имени файла отключена.

Отключение подстановки также не отключает раскрытие фигурных скобок({...})или подоболочки ((...)), которые потенциально могут случайно появиться в URL-адресах.

1
28.07.2021, 11:35

Теги

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