Функция 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 .

  • Как сделать работу с закладкой ZSH с двумя вкладками
  • применить темы zsh вручную
  • Выполните заданную команду на каждом подпути длинного пути
  • При передаче аргументов в программы через переменные массива
  • После установки oh-my-zsh: ... /.zshrc:source:34: нет такого файла или каталога ... /.oh-my-zsh/oh-my-zsh.sh
  • ZSH и завершение файлов с символами новой строки
  • Разделить оболочку горизонтально, чтобы показать ls -al и pwd
  • Изменить местоположение замещения процесса zsh '= ()'
  • Экспорт РЕДАКТОР с флагом
  • zsh завершение - показать больше параметров, чем просто псевдоним
  • сбросить терминал с помощью сочетания клавиш (без клавиши ввода)
  • Linux и Unix - лучшая ОС в мире.