bash 스크립트 끝에 변수와 관련된 여러 줄을 추가하는 방법은 무엇입니까?

bash 스크립트 끝에 변수와 관련된 여러 줄을 추가하는 방법은 무엇입니까?

나는 다음을 추가하고 싶습니다 :

function ps_mem {
   python /home/vagrant/ps_mem/ps_mem.py -p $@
}

명령줄에서 종료합니다 ~/.bashrc. 나는 다음을 사용해 보았습니다.

printf "function ps_mem {\n python /home/vagrant/ps_mem/ps_mem.py -p $@ \n}" >> ~/.bashrc

거의 작동하지만 입력 필드는 $@무시되어 다음을 수행합니다.

function ps_mem {
 python /home/vagrant/ps_mem/ps_mem.py -p
}

대신 끝에 추가해야 합니다 ~/.bashrc.

답변1

이러한 종류의 작업에는 다음 문서를 사용하십시오.

cat <<'EOF' >>~/.bashrc
function ps_mem {
   python /home/vagrant/ps_mem/ps_mem.py -p "$@"
}
EOF

<<'EOF'쉘은 인용될 때 이 문서의 특수 문자를 확장하지 않습니다. POSIX에서쉘 명령 언어:

단어에 인용된 문자가 있으면 [...] 이 문서 줄을 확장하면 안 됩니다.

답변2

"큰 따옴표를 작은 따옴표로 바꾸면 원래 질문의 printf가 작동합니다.

나는 printf이런 식으로 사용하는 것을 좋아합니다. 와 같은 특별한 인용 규칙은 없습니다 here documents. 그리고 아무 생각 없이 \n. 당신이 보는 것은 당신이 얻는 것입니다:

printf '%s' '
function ps_mem {
   python /home/vagrant/ps_mem/ps_mem.py -p "$@"
}
' >> ~/.bashrc

답변3

작업에 대한 다른 답변이 제공되었지만 귀하가하려는 작업을 정확하게 수행하도록 돕는 정신으로 (완벽하게 좋은 접근 방식이기 때문에) 다음과 같습니다.

원본 텍스트는 다음과 같습니다.

printf "function ps_mem {\n python /home/vagrant/ps_mem/ps_mem.py -p $@ \n}" >> ~/.bashrc

작동하는 버전은 다음과 같습니다.

printf 'function ps_mem {\n python /home/vagrant/ps_mem/ps_mem.py -p $@ \n}' >> ~/.bashrc

큰따옴표도 추가하는 것이 좋습니다 $@.

printf 'function ps_mem {\n python /home/vagrant/ps_mem/ps_mem.py -p "$@" \n}' >> ~/.bashrc

변수 확장은 큰따옴표 안에 활성화되고 작은따옴표 안에는 비활성화됩니다.

답변4

원하는 출력을 얻으려면 아래와 같이 이스케이프 시퀀스를 사용할 수 있습니다.

  python /home/vagrant/ps_mem/ps_mem.py -p \$@ 

관련 정보