Функция Zsh с su и echo

Я пытаюсь добавить функцию к моему .zshrc что упрощает добавление новых флагов USE в мой файл /etc/portage/package.use . Обычно я должен был бы сделать

 su -c 'echo "net-misc/aria2 bash-completion bittorrent" >> /etc/portage/package.use' 

Поэтому я попытался сделать такую ​​функцию, как

 new_use() { su -c 'echo "$1" >> /etc/portage/package.use' } 

но потом я понял, что это не сработает. Я хочу знать, есть ли способ заставить эту функцию работать, или, по крайней мере, если функции подходят для этого. Кстати, я не против вводить пароль root каждый раз, когда я вызываю функцию.

3 Solutions collect form web for “Функция Zsh с su и echo”

Просто измените кавычки.

 new_use() { su -c "echo '$1' >> /etc/portage/package.use" } 

Это вызовет расширение $1 до выполнения su .

Вы можете подавать stdin в программу с привилегиями root, например:

 new_use() { sudo tee -a /etc/portage/package.use <<< "$1" > /dev/null } 

Аргумент функции не передается в базовую оболочку. Вы можете заменить аргумент внутри строки su будет передаваться в корневую оболочку, но будьте осторожны, что строка будет проанализирована корневой оболочкой, поэтому специальные символы в ней будут расширены. Чтобы избежать этого дополнительного расширения (которое может привести к выполнению произвольного кода с правами root), интерполируйте строку между одинарными кавычками (которая буквально интерпретирует все символы, отличные от ' ), и защищайте одиночные кавычки в строке ( '\'' завершает строковый литерал, добавляет одиночную кавычку и запускает новый литерал, что означает, что '\'' это фактически способ поставить одну цитату внутри буква, ограниченного одинарными кавычками).

 new_use() { su -c "echo '${1//\'/\'\\\'\'}' >> /etc/portage/package.use" } 

Другим возможным подходом является использование tee .

  • Функции Ksh включены в Zsh?
  • Изменить шрифт в команде echo
  • Поддерживают ли оболочки рекурсию?
  • Клавиатурные привязки от bash до zsh?
  • Ctrl-Arrow больше не работает после установки Prezto
  • Скрипт Zsh, который принимает переменное количество аргументов
  • Обновление zsh на красной шляпе 5 x86_64
  • как различать пользовательские сервисы и системные службы в systemd?
  • zmv для zsh: сухие пробеги и справочные страницы
  • Как я могу расширить все переменные в командной строке в Zsh?
  • Когда я пытаюсь добавить Android SDK в свой PATH, он дает контекстную ошибку
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.