sed를 사용하여 .bashrc의 PATH 변수를 업데이트하세요.

sed를 사용하여 .bashrc의 PATH 변수를 업데이트하세요.

PATH 변수를 .bashrc 파일에 넣어 영구적으로 업데이트하려고 했습니다. 그러나 파일에 추가하고 싶지 않고 현재 PATH=........를 세션에 사용하는 PATH 변수로 바꿉니다. 이것이 내가 지금까지 가지고 있는 것입니다:

sed 's/^PATH=.*/${PATH=$PATH}/' .bashrc > .bashrc

이것은 온라인에서 본 명령이 뒤죽박죽인데, 이를 실행하면 .bashrc PATH 행이 모든 항목으로 덮어쓰여집니다. 지난 한 시간 동안 얻은 sed 지식에 awk 같은 시도를 포기하지 않고 추가하고 싶기 때문에 sed를 사용하는 솔루션이 있기를 바랍니다.

답변1

첫 번째: 읽고 있는 파일에 쓰지 마세요. 결국 파일이 삭제될 수 있습니다. 대신 내부 편집 기능( -i)을 사용해 보세요.

다음으로, 큰 따옴표( ) 내에서는 변수 대체가 작동하지 않으므로 거기에서 확장 대체를 수행 '하려면 다른 작업을 수행해야 합니다 .$PATH

마지막으로 대체 구문을 깨뜨리는 문자가 $PATH포함될 수 있으므로 다른 구분 기호를 사용해야 합니다./sed

경로에 ;s가 포함되어 있지 않다고 가정하고 다음을 시도해 보십시오(물론 현재 파일을 백업한 후).

sed -i 's;^PATH=.*;PATH='"$PATH"';' .bashrc

대체의 일치 부분은 다음을 의미합니다. ^( )로 시작 PATH=하고 뒤에 임의의 문자( .)가 여러 번( *) 오는 문자열과 일치합니다. 즉, 정확한 시작 부분의 줄과 일치하지만 PATH=중간 어딘가의 줄은 일치하지 않습니다. PATH=이는 .*전체 라인을 교체하기를 원하기 때문에 중요합니다(라인 없이 시도해 보고 무슨 일이 일어나는지 확인하세요).

$PATH$PATH공백 문자 포함을 고려하여 대체 인용이 필요합니다.

데모:

$ foo=bar
$ echo hello | sed -e 's/hello/$foo/'
$foo

환경. 변수는 큰 따옴표 내에서 대체되지 않습니다. 그래서 $foo거기에는 문자 그대로의 의미가 있습니다. 이제 쉘이 하드 따옴표를 제거하여 이를 확장하도록 합니다.

$ foo=bar
$ echo hello | sed -e 's/hello/'$foo'/'
bar

좋아요! 하지만 이는 안전하지 않습니다.

$ foo="bar baz"
$ echo hello | sed -e 's/hello/'$foo'/'
sed: -e expression #1, char 11: unterminated `s' command

sed위의 두 인수가 수신된 후 각각 -e: s/hello/bar및 입니다 baz/. 안좋다. 이 문제를 해결하려면 더 많은 인용문이 필요합니다.

$ foo="bar baz"
$ echo hello | sed -e 's/hello/'"$foo"'/'
bar baz

"환경 변수를 다른 것에 인수로 전달할 때는 거의 항상 환경 변수를 따옴표로 묶어야 합니다. 그렇지 않으면 ( $IFS변경되지 않았다고 가정하면) 공백으로 분할됩니다.

관련 정보