변수에서 명령을 실행하는 방법

변수에서 명령을 실행하는 방법

내 상황은 다음과 같습니다.

SEARCH="find `pwd` -name"

bash> $SEARCH resources.xml | grep $SEARCH_DIR | grep $1 | grep ‘cells’

pwd하지만 해당 변수에서 참조되는 내용을 알 수 없습니다 .

답변1

alias SEARCH='find . -name'

또는

SEARCH() { find . -name "$1"; }

용법

SEARCH resources.xml | ...

이는 SEARCH변수가 아닙니다. 명령을 변수( SEARCH='find . -name')로 정의할 수 있지만 별칭이나 함수 정의가 더 일반적입니다.

답변2

현재 디렉토리는 라인이 평가될 /original/directory때 와 라인이 평가될 때로 가정됩니다.SEARCH=…/later/directory$SEARCH …

변수가 정의될 ​​때 명령 대체가 `pwd`평가되므로 로 설정됩니다. 해당 시점의 현재 디렉터리에 공백이나 와일드카드가 포함되어 있지 않으면 나중에 해당 디렉터리에서 호출됩니다.SEARCHSEARCHfind /original/directory -name$SEARCH resources.xmlfindfind /original/directory -name resources.xml

원래 현재 디렉터리에 공백이나 와일드카드가 포함되어 있으면 이 작업이 작동하지 않습니다. 이와 같은 변수에 명령을 채우는 것은 매우 간단한 경우를 제외하고는 작동하지 않습니다. 바라보다공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

find에서 실행 하려면 /later/directory를 실행하세요 find .. 그러나 여기서 변수는 올바른 도구가 아닙니다. 변수는 문자열을 저장하는 데 사용됩니다. 매개변수가 있는 명령은 문자열이 아니지만목록끈. 셸 코드 조각은 문자열로 저장될 수 $SEARCH있지만아니요SEARCH셸 조각으로 값을 실행합니다(다시 참조).공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?). 나중에 사용할 수 있도록 셸 코드 조각을 저장하려면 함수를 정의하세요.

SEARCH () {
  find "$PWD" -name "$@"
}
SEARCH resources.xml | …

다시 말하지만, find에서 실행 /later/directory하려면 가장 좋은 방법은 디렉터리를 변수에 저장하고 나중에 해당 변수를 사용하는 것입니다.find/original/directory

original_directory="$PWD"
SEARCH () {
  find "$original_directory" -name "$@"
}
SEARCH resources.xml | …

관련 정보