csh/tcsh에서 eval로 처리되는 명령에 리터럴 중괄호를 어떻게 통합할 수 있나요?

csh/tcsh에서 eval로 처리되는 명령에 리터럴 중괄호를 어떻게 통합할 수 있나요?

좀 더 자세히 말하자면 상황은 이렇습니다.

타사 소프트웨어에 대한 환경 및 별칭을 설정하기 위해 모듈 파일(즉, 환경 모듈 패키지에서 사용하는 유형)을 준비하려고 합니다. 특히 일부 가명은 나에게 슬픔을 안겨줍니다. 작성자가 제공한 쉘 리소스 파일은 쉘에 구애받지 않는 환경에서 벗어나고 싶기 때문에 모듈 파일에 관심이 있습니다. 리터럴 중괄호를 포함하는 별칭을 설정합니다. 모듈 파일에 동일한 문자열을 넣으려고 하면 중괄호의 내용이 확장됩니다.

csh/tcsh에서는 모듈 파일의 set-alias 명령이 처리되어 쉘에서 제공하는 "alias" 명령으로 바뀌는 것 같습니다. 그런 다음 eval을 사용하여 다음과 같이 처리됩니다.

eval `alias foo 'thing to alias foo to';`

(예, 후행 세미콜론은 명령의 일부입니다).

나는 사용자 정의 버전의 모듈을 컴파일하지 않고는 eval, 평가된 문자열 주위에 큰 따옴표가 없거나 별칭 텍스트 주위에 작은 따옴표 등의 요소에서 벗어날 수 없습니다. 하다.

이제 별칭에 중괄호가 포함되어 있으면 eval 문의 컨텍스트에서 이를 해석되지 않도록 보호하는 방법을 알 수 없습니다. 여기에서 Timbuktu까지 백슬래시를 시도했고, 큰 따옴표를 시도했고, 작은 따옴표를 시도했고, 큰 따옴표 안에 작은 따옴표를 시도했고, 위의 조합을 시도했습니다. 지금까지 아무 것도 효과가 없었고 터무니없는 일에 접해 있습니다. 광범위한 인터넷 검색에도 불구하고 어떤 답변도 찾을 수 없었습니다.

중괄호를 피할 수 있는 방법이 있나요? 그렇지 않다면 알려주세요. 그러면 저는 제 삶을 계속하겠습니다. 그렇다면 재컴파일이 필요하지 않으며 조언을 주시면 감사하겠습니다. 감사해요!

답변1

tcsh/csh에 대한 내 솔루션은 약간 장황합니다. "{"를 별도의 변수에 붙이는 것입니다.

  set lc="{"
  set rc="}"

나는 탈출하는 데 어려움을 겪는 달러 기호에 대해서도 동일한 작업을 수행합니다. grep 정규 표현식에 매우 유용합니다.

내 .cshrc에서 잘라서 붙여넣은 내용은 다음과 같습니다.

  set dollar = \$

내가 말했듯이 사용 결과는 장황하지만 적어도 작동합니다.

> echo "${dollar}${lc}this is inside curlybraces${rc}"
${this is inside curlybraces}

추가 따옴표가 필요합니다.

도움이 되었기를 바랍니다!

답변2

또 다른 해결책:

set-alias foo {env LD_LIBRARY_PATH=`printf "\044\173LD_LIBRARY_PATH\175"`:/some/path command-to-run}

044, 173 및 175는 ASCII 문자 $, { 및 }에 대한 8진수 코드입니다.

답변3

사용작은따옴표 2개중괄호를 보호(이스케이프)하기 위한 것입니다. 변수를 에코할 때 하나의 큰따옴표(")가 필요할 수 있습니다.

set a=''{''
echo "$a"

또한 역따옴표( ) 내의 에코는 이스케이프된 대괄호와 함께 사용할 수 있습니다.

set b = " COMMANDS `echo ''{''` MORE COMMANDS `echo ''}''` "  
echo "$b"

관련 정보