su 및 echo를 사용한 Zsh 기능

su 및 echo를 사용한 Zsh 기능

내 파일에 새로운 USE 플래그를 더 쉽게 추가할 수 .zshrc있도록 파일에 함수를 추가하려고 합니다 . /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'
}

그러나 나는 이것이 효과가 없을 것이라는 것을 깨달았습니다. 이 기능을 작동시킬 수 있는 방법이 있는지, 아니면 적어도 이 기능이 이에 적합한지 궁금합니다. 그런데 이 함수를 호출할 때마다 루트 비밀번호를 입력해야 하는 것은 괜찮습니다.

답변1

다음과 같이 루트 권한으로 프로그램에 stdin을 제공할 수 있습니다.

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

답변2

따옴표를 반대로 바꾸십시오.

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

이렇게 하면 $1실행 전에 확장 됩니다 su.

답변3

함수의 매개변수는 기본 쉘로 전달되지 않습니다. 루트 쉘에 전달될 문자열의 매개변수를 바꿀 수 있지만 su문자열은 루트 쉘에 의해 구문 분석되므로 문자열의 특수 문자가 확장됩니다. 이러한 추가 확장(임의의 코드가 루트로 실행될 수 있음)을 방지하려면 작은따옴표 사이에 문자열을 삽입하고( '문자 그대로 제외한 모든 문자가 해석되도록 함) 문자열에서 작은따옴표 문자를 보호하십시오( '\''문자열 리터럴 종료). , 작은따옴표를 추가하고 새 리터럴을 시작합니다. 이는 '\''실제로 작은따옴표로 구분된 리터럴 안에 작은따옴표를 넣는 방법임을 의미합니다.

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

또 다른 가능한 접근법은사용tee.

관련 정보