Ubuntu 15의 파일에 다음 코드 줄이 있습니다 /etc/bash.bashrc
. 파일의 다른 주석을 엉망으로 만들지 않고 명령줄에서 이 줄만 주석 처리를 제거하려면 어떻게 해야 합니까?
# enable bash completion in interactive shells
#if ! shopt -oq posix; then
# if [ -f /usr/share/bash-completion/bash_completion ]; then
# . /usr/share/bash-completion/bash_completion
# elif [ -f /etc/bash_completion ]; then
# . /etc/bash_completion
# fi
#fi
원하는 출력은 다음과 같아야 합니다.
# enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
이 파일에는 내가 엉망으로 만들고 싶지 않은 다른 코드 줄이 있다는 점을 명심하세요. 이 작업은 bash 스크립트에 의해 자동으로 수행되어야 합니다.
답변1
실제로 이를 요청하는 것은 다중 프로필 bashrc를 수행하는 매우 잘못된 방법입니다. 기본 .bashrc 파일에 대한 다양한 요구 사항을 정의하고 필요할 때 가져올 수 있는 .bashrc_1, .bashrc_rc2와 같은 몇 가지 다른 .bashrc 파일이 있어야 합니다.
그게 다야.
답변2
전체 문서를 보지 않고는 명확한 답변을 드릴 수 없습니다. 및 `의 인스턴스가 하나만 있는 경우 if ! shopt -oq posix;
이를 사용하여 관련 부분을 구분할 수 있습니다.
perl -i -pe '$i++ if /^#if ! shopt -oq posix;/; s/^#// if $i==1; $i=0 if /^fi/' /etc/bash.bashrc
스크립트는 로 시작하는 줄을 처음 만나도록 $i
설정 되어 있습니다 . (대체 연산자가 이 시점에서 주석 처리를 해제했기 때문이 아니라) 로 시작하는 행을 발견하면 다시 설정합니다. 그런 다음 해당 줄의 시작 부분에서 주석을 제거합니다.1
#if ! shopt -oq posix;
0
fi
#fi
$i
1
노트
- 다음으로 시작하는 행이 두 개 이상인 경우
#if ! shopt -oq posix;
- 뒤에 공백이 있으면 실패합니다
#
.
더 나은 접근 방식은 관련 섹션이 다른 콘텐츠와 명확하게 구분되도록 파일을 편집하는 것입니다. 예를 들면 다음 XXXstart
과 같습니다 XXXend
.
그런 다음 보다 일반적인 접근 방식을 취할 수 있습니다.
# enable bash completion in interactive shells
# XXXstart
#if ! shopt -oq posix; then
# if [ -f /usr/share/bash-completion/bash_completion ]; then
# . /usr/share/bash-completion/bash_completion
# elif [ -f /etc/bash_completion ]; then
# . /etc/bash_completion
# fi
#fi
#XXXend
이제 파일에서 다음 스크립트를 사용하십시오.
perl -i -pe '$i=0 if /XXXend/; s/^\s*#*// if $i==1; $i=1 if /XXXstart/; ' /etc/bash.bashrc
마지막으로 하지 마세요. 장난치지 마세요 /etc/bash.bashrc
. 다음 줄을 추가하십시오.당신의 ~/.bashrc
/etc/bash.bashrc
첫째로 더 깨끗하고 안전하기 때문이며, 둘째로 파일에 대한 모든 변경 사항이 다음 업데이트로 덮어쓰기 때문 입니다 /etc
.
답변3
에 연결할 임시 파일을 생성해 보는 것은 어떨까요
/etc/bash.bashrc
?cat /tmp/posix-opt.txt >> /etc/bash.bashrc
(이렇게 하면 /etc/bash.bashrc에 /tmp/posix-opt.txt(주석 처리되지 않은 행 포함)가 추가됩니다.)
가능하지 않다면
n=$(grep -n 'shopt -oq posix' /etc/bash.bashrc) sed -i -e "$n,$(($n + 7))s/^#//" /etc/bash.bashrc
이는 vi와 동일합니다. 줄 번호를 얻으려면 grep만 하면 됩니다.
그러나 두 줄에 "shopt -oq posix"가 포함되어 있으면 스크립트가 중단된다는 점에 유의하세요.
답변4
제가 제안한 이 솔루션은 약간의 준비가 필요하지만 저는 괜찮습니다.
먼저 소스 파일을 임시 폴더에 복사합니다.
cp /etc/bash.bashrc /var/ldt/bash.bashrc_modifed
그런 다음 /var/ldt/bash.bashrc_modifed에서 필요한 것만 편집합니다.
다음을 실행하여 패치를 만듭니다.
diff -u /etc/bash.bashrc /var/ldt/bash.bashrc_modifed > /var/ldt/bash.bashrc_patch
이제 실제로 원하는 부분에만 변경 사항을 적용할 수 있습니다.
patch /etc/bash.bashrc < /var/ldt/bash.bashrc_patch