내가 찾고 있는 형식으로 답변이 있을 수도 있고 없을 수도 있는 질문이 있지만 어떤 형식이라도 충분합니다.
현재 grep을 사용하여 파일에서 특정 줄을 찾은 다음 sed를 사용하여 특정 문자 뒤의 모든 텍스트를 가져오는 셸 명령을 사용하는 구성 파일이 있습니다. 나머지 텍스트는 환경 변수가 포함된 파일 경로입니다. 이 명령의 출력은 다음을 반환합니다.
$LIGHTS_HOME/음악/something.mp3
그런 다음 mp3info로 파이프하여 mp3 파일에서 사용 가능한 메타데이터를 가져오고 싶습니다. 그러나 mp3info $LIGHTS_HOME으로 파이프하면 연결된 실제 파일 경로로 확장되지 않습니다. 한 줄로 어떻게 확장할 수 있나요? 가능합니까?
이것은 내 현재 명령입니다.
$ sudo grep -w "file_path =" /home/pi/lightshowpi/config/state.cfg |
sed 's/.*= //' | sed 's|'\$LIGHTS_HOME'| '/home/pi/lightshowpi'|' |
xargs mp3info -p "Now Playing: %t by %a" | xargs sudo python /home/pi/lightshowpi/tweet/tweet.py
이 명령이 수행하는 작업(읽기 쉽도록 줄을 편집했습니다. 사용 시에는 한 줄이어야 합니다(필요한 경우 여러 줄을 사용하는 것이 좋습니다).
첫 번째 줄은 grep을 사용하여 'file_path = $LIGHTS_HOME/music/songname.mp3' 줄을 반환하는 'file_path =' 줄을 찾습니다.
그런 다음 명령문을 구문 분석하고 "=" 뒤의 모든 문자(이 경우 "$LIGHTS_HOME/music/songname.mp3")를 반환하는 sed로 파이프됩니다.
거기에서 두 번째 sed 명령을 사용하여 $LIGHTS_HOME을 변수 값 '/home/pi/lightshowpi/'로 대체했습니다.
이상적으로는 두 번째 sed 문을 제거하고 대신 '$LIGHTS_HOME'을 '/home/pi/lightshowpi/' 값으로 평가하는 것을 사용하고 싶습니다.
그런 다음 mp3info는 이를 사용하여 stdout으로 형식화된 파일의 메타데이터를 가져온 다음 xargs로 파이프하여 메타 stdout을 python 스크립트에서 사용하는 stdin 형식으로 준비하고 해당 값을 다른 이모티콘 문자와 함께 보냅니다(Python 스크립트는 이렇게 하는 데는 문제가 없습니다)
그러나 /home/pi/lightshowpi를 대체하기 위해 두 번째 sed 명령을 사용하는 것보다 $LIGHTS_HOME을 확장하는 것이 좋습니다. 왜냐하면 다른 설치에서는 이 변수가 홈 디렉토리가 아닌 다른 위치에 설정될 수 있기 때문입니다.
나는 이것을 터미널에서 시도하고 있으며 쉘 스크립트에 넣는 것이 아니라는 점에 유의해야 할 것 같습니다. 이것이 상황을 바꿀지는 잘 모르겠습니다. 저는 여전히 쉘을 배우려고 최선을 다하고 있지만, 계속해서 발생하는 오류에 따라 상황이 바뀔 수 있다고 믿습니다.
답변1
(e)
ZSH를 사용하면 변수에 지정된 매개변수 확장 플래그를 사용하여 "매개변수 확장, 명령 대체 및 산술 확장을 수행"할 수 있습니다 x
( zshexpn(1)
자세한 내용은 참조).
x='$HOME/blablah'; echo $x; echo ${(e)x}
또는 파일에서:
echo '$HOME/fromfile' > afile
echo ${(e)$(<afile)}
여기에는 다음과 같은 여러 가지 장점이 있습니다 eval
.
$ touch somefile
$ echo 'hi; rm somefile' > x
$ eval "echo `cat x`"
hi
$ ls somefile
ls: somefile: No such file or directory
$ exec zsh
% touch somefile
% echo ${(e)$(<x)}
hi; rm somefile
% ls somefile
somefile
%
답변2
기본적으로 이 코드 줄은 구성 파일 /home/pi/lightshowpi/config/state.cfg에서 "file_path=" 줄을 검색한 다음 환경 변수 $SYNCHRONIZED_LIGHTS_HOME을 해당 값으로 확장하고 이를 mp3info로 파이프합니다. 그런 다음 MP3 파일 Twitter API를 통해 계정에 트윗하기 위해 Python 이모티콘 라이브러리에서 이모티콘을 포함하는 동안 인수를 취하고 원하지 않는 문자를 제거하는 Python 스크립트에 문자열을 파이프합니다.
sed '/file_path =/!d;s|.*= ||;s|$SYNCHRONIZED_LIGHTS_HOME|'"$SYNCHRONIZED_LIGHTS_HOME|" /home/pi/lightshowpi/config/state.cfg | xargs mp3info -p "Now Playing %t by %a" | xargs sudo python /home/pi/lightshowpi/tweet/tweet.py
이 명령의 핵심은 사용하는 것입니다! "file_path="를 제외하고 mp3info 및 tweet.py에 xargs를 사용하십시오.
이 명령을 이 오픈 소스 프로젝트에 공통적으로 적용하기 위해 /home/pi/lightshowpi 대신 동일한 변수 $SYNCHRONIZED_LIGHTS_HOME을 사용하여 다음 /home/pi/lightshowpi/config/state.cfg를 디버깅하겠습니다.
답변3
$myvar 변수에 $LIGHTS_HOME/music/something.mp3 값이 있다고 가정합니다.
다음과 같은 방법으로 확장할 수 있습니다.
mp3info $(eval echo $myvar)