Bash에서 인용 된 문자열 내에서 환경 변수를 사용하는 방법
bash 스크립트에서 다음과 같은 다양한 형태를 시도했습니다.
#!/bin/bash
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
그러나 COLUMNS
환경 변수 를 올바르게 확장하는 구문을 얻을 수 없습니다 .
다음과 같은 다양한 형태를 시도했습니다.
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS'
과
svn diff $@ --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}'
과
eval svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
제안?
확실하지 않은 경우 터미널에서 'cols'요청을 사용하고 COLUMNS를 잊어 버릴 수 있습니다.
COLS=$(tput cols)
제목에서 묻는 일반적인 질문에 대한 답변을 찾고있는 Google을 통해 여기에 온 모든 사람들을위한 간단한 메모 / 요약입니다 (예전처럼). 따옴표 안의 쉘 변수에 액세스하려면 다음 중 하나가 작동해야합니다.
echo "$VARIABLE"
echo "${VARIABLE}"
작은 따옴표 사용이 주요 문제입니다. Bash Reference Manual 에 따르면 :
작은 따옴표 (
'
)로 문자를 묶으면 따옴표 안에있는 각 문자의 리터럴 값이 유지됩니다. 백 슬래시가 앞에있는 경우에도 작은 따옴표 사이에 작은 따옴표를 사용할 수 없습니다. [...] 따옴표 둘러싸 자 ("
)를 제외한 시세 내의 모든 문자의 리터럴 값을 보존하고$
,`
,\
, 및, 기록 팽창이 활성화되면!
. 문자$
와`는 큰 따옴표 안에 특별한 의미를 유지합니다 (셸 확장 참조). 다음 문자 중 하나 다음에 할 때 백 슬래시는 특별한 의미를 유지 :$
,`
,"
,\
, 또는 개행. 큰 따옴표 내에서 이러한 문자 중 하나가 뒤에 오는 백 슬래시는 제거됩니다. 특별한 의미가없는 문자 앞의 백 슬래시는 수정되지 않은 상태로 남습니다. 큰 따옴표 앞에 백 슬래시를 붙여 큰 따옴표로 묶을 수 있습니다. 활성화 된 경우,!
큰 따옴표로 표시된 부분이 백 슬래시를 사용하여 이스케이프 되지 않는 한 히스토리 확장이 수행됩니다 . 앞의 백 슬래시!
는 제거되지 않습니다. 특수 매개 변수*
와는@
큰 따옴표 (쉘 변수 확장 참조) 할 때 특별한 의미를 가지고있다.
질문에서 묻는 특정 경우에서 $ COLUMNS는 비표준 속성을 갖는 특수 변수입니다 (위의 lhunath의 답변 참조).
참고 COLUMNS
:
- 환경 변수가 아닙니다 . bash 자체에 의해 설정되는 일반 bash 매개 변수입니다.
SIGWINCH
신호 를 받으면 자동으로 설정됩니다 .
두 번째 점은 일반적으로 COLUMNS
변수가 bash 스크립트가 아닌 대화식 쉘 에서만 설정 된다는 것을 의미합니다 .
스크립트 stdin
가 터미널에 연결되어있는 경우 터미널에 요청하여 수동으로 터미널 너비를 조회 할 수 있습니다.
tput cols
그리고 이것을 SVN 명령에서 사용하려면 :
svn diff "$@" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)"
(참고 : 인용 "$@"
하고 eval
;-) 에서 멀리 떨어져 있어야합니다. )
다음 스크립트는 $COLUMNS
. COLUMNS
이 통화 전에 설정하지 않았는지 궁금합니다 .
#!/bin/bash
COLUMNS=30
svn diff $@ --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS"
Can you echo $COLUMNS
inside your script to see if it set correctly?
You are doing it right, so I guess something else is at fault (not export-ing COLUMNS ?).
A trick to debug these cases is to make a specialized command (a closure for programming language guys). Create a shell script named diff-columns doing:
exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "$@"
and just use
svn diff "$@" --diff-cmd diff-columns
This way your code is cleaner to read and more modular (top-down approach), and you can test the diff-columns code thouroughly separately (bottom-up approach).
'Programing' 카테고리의 다른 글
변수의 첫 글자 대문자 (0) | 2020.09.22 |
---|---|
웹 사이트의 기본 URL을 가져 와서 Symfony 2의 나뭇 가지에 전역으로 전달 (0) | 2020.09.22 |
iOS 7에서 상태 표시 줄 배경색과 텍스트 색상을 변경하는 방법은 무엇입니까? (0) | 2020.09.22 |
탭 표시 줄 항목 텍스트 제거, 이미지 만 표시 (0) | 2020.09.22 |
"성공적인 빌드가 될 때까지 디자인 편집기를 사용할 수 없습니다"오류를 어떻게 해결할 수 있습니까? (0) | 2020.09.22 |