Mac OS X에서 작동하지 않는 명령이 포함된 스크립트가 있는 github에서 변경 사항을 가져오는 스크립트를 설정하려고 합니다.
내 목표는 etc를 사용하여 sed
이 스크립트의 명령을 대체하는 것입니다.
다음 명령은 다음과 같습니다.
원래 명령(스크립트에서 대체됨):
DIR=$(dirname "$(readlink -f $0)")
새 명령(대체하고 싶은 명령):
DIR="$(cd "$(dirname "$0")" && pwd -P)"
내가 지금까지 시도한 것 :
StartStopScript="/path/to/script.sh"
DIRnew=""$(cd "$(dirname "$0")" && pwd -P)""
DIRold=""$(dirname "$(readlink -f $0)")""
echo "$StartStopScript" | sed -e 's/"$DIRold"/"$DIRnew"/g'
이는 실패하고 명령은 문자열로 해석되지 않고 실행되는 것 같습니다.
그림은 따옴표로 귀결됩니다 sed
.
제가 받을 수 있는 도움에 감사드립니다.
답변1
OrigScript="/path/to/script.sh"
echo $OrigScript
/path/to/script.sh
#note: no quotes
OrigScript='"/path/to/script.sh"'
echo $OrigScript
"/path/to/script.sh"
#note: with quotes, but not good for filesnames, rather use "$filename" in the command argument
DIRnew='"$(cd "$(dirname "$0")" \&\& pwd -P)"'
echo $DIRnew
"$(cd "$(dirname "$0")" \&\& pwd -P)"
#note: with quotes, escaping & needed for suppressing interpretation by sed
DIRold='"$(dirname "$(readlink -f $0)")"'
echo $DIRold
"$(dirname "$(readlink -f $0)")"
#note: in your question the original DIR=.. did NOT have double quotes,
#I assume a typo
sed -e "s/$DIRold/$DIRnew/g" "$OrigScript"
#note: $OrigScript should NOT have the double quotes in it!
#note: I assume $OrigScript == $StartStopScript
#test:
echo $DIRold | sed "s/$DIRold/$DIRnew/"
"$(cd "$(dirname "$0")" && pwd -P)"
#result includes double quotes!
1) (큰) 따옴표를 사용하여 변수를 선언하려면 따옴표가 문자열 내에 포함되도록 따옴표를 이스케이프해야 하며, 가급적 작은 따옴표를 사용하여 내부 문자열이 완전히 문자열이고 변수가 해석되지 않도록 해야 합니다. 이는 또한 &
의 사용을 단순화하고 $()
쉘이 이를 해석하지 않기 때문에
2) echo
ing(큰따옴표)의 경우 이스케이프 처리하세요.
sed
3) 쉘 변수가 해석되도록 하려면 sed
명령 주위에 큰따옴표를 사용해야 합니다. 작은따옴표를 사용하면 명령은 sed 's/$a/$b/'
실제 문자열 '$a'를 문자열 '$b'로 바꾸려고 시도합니다. 특수 사례 $
) 의미 , 임의의 문자가 포함된 문자열과 마찬가지로 sed
명령의 변수 주위에 sed
큰따옴표가 필요하지 않습니다 (특수 명령 문자에 대한 제한 사항 있음 ).sed
sed
4) echo "$StartStopScript" | sed -e 's/"$DIRold"/"$DIRnew"/g'
변수를 에코하고 $StartStopScript
(이것은 스크립트의 파일 이름일 뿐이라고 가정합니다) 해당 문자열에서 변수(예: 파일 이름)를 바꾸려고 합니다. sed
파일 에 적용하려면 sed 's/a/b/g' file
(output-write stout
)를 사용하고, 파일을 덮어쓰려면 -i
(주의해서 사용하십시오. 즉, 올바른 교체를 먼저 테스트하십시오)
5) 는 초기(일치하는) 패턴을 다시 인쇄하는 &
에서 특별한 의미를 갖습니다 .sed
echo ABC | sed 's/A/&12/'
A12BC
해석을 억제하려면 대체 패턴에서 이스케이프해야 합니다.
echo ABC | sed 's/A/\&12/'
&12BC
따라서 변수는 $DIRnew
문자열에서 백슬래시를 이스케이프 처리해야 합니다.
6) 그 외에도 루프를 사용하여 if
운영 체제를 식별하고 그에 따라 명령을 조정하는 것이 좋습니다. 이렇게 하면 두 운영 체제 모두에 대해 하나의 스크립트만 필요합니다. 즉
if [ OS = Mac ] ; then
dir=MacDir
else
dir=LinuxDir
fi