그래서 저는 크로스컴파일을 많이 했고, 종종 이런 식으로 타이핑하곤 했어요.
FOO=bar command --some-args
BAZ=qxt other-command --other-args
그러나 실제 쉘 변수는 매우 길고 입력하기가 번거롭습니다. Bash는 동적 언어가 아니므로 백틱이 작동하지 않습니다(FOO=bar 명령을 실행하려고 시도함). xargs가 잘못되었지만 명령이 평가되기 전에 유사한 작업을 수행하는 것이 좋을 것입니다. 환경 변수로 원하는 쉘 변수를 설정하면 명령 앞에 백틱과 동일한 문제가 발생합니다. 매번 명시적으로 env를 변경하면 질문을 입력하고 재미도 더해집니다. 내 미래의 환경을 오염시킵니다. pushenv 및 popenv와 비슷한 것이 있습니까?
짧은 핸들을 통해 필요한 모든 쉘 변수를 저장하고 검색하여 다음과 같은 작업을 수행할 수 있는 방법이 있습니까?
shellvars1 command --some-args
shellvars2 other-command --other-args
쉘 변수의 다양한 조합은 크지만 제한적이므로 이를 도우미 스크립트로 오프로드할 수 있는 방법이 있다면 한꺼번에 입력할 수 있지만 그렇게 하는 방법을 찾을 수 없습니다.
보너스 포인트: bash에는 tcsh와 유사한 기능이 있습니까?
!24:s/FOO/BAZ/
?
이것도 도움이 될 수 있습니다(비록 그다지 많지는 않지만). 나는 주로 철자 실수로 초자연적인 힘을 과시할 기회를 없애고 싶었습니다.
답변1
쉘 변수가 무엇인지 아닌지에 대해 약간 혼란스러워하는 것 같습니다. 게시물의 모든 변수는 쉘 변수가 아닌 환경 변수입니다. 셸 변수를 설정합니다.
foo=bar
환경 변수를 설정하려면 다음 안내를 따르세요.
export FOO=BAR
(또는 c 쉘의 setenv). 하지만
FOO=BAR command
직관에 반해 할당은 이전과 다른 의미를 가지며 환경 변수는 명령 환경에서만 설정됩니다. 즉, 이 간단한 스크립트는 필요한 작업을 수행해야 합니다.
#!/bin/bash
VAR1=VAL1 ... VALN=VARN "$@"
추가 질문에 관해서는: 나는 bash가 이것을 할 수 없다고 생각하지만 zsh는 훌륭하고 그것을 할 수 있습니다. 둘 다
^FOO^BAR
그리고
!!:s/FOO/BAR/
특정 예의 경우 동일한 효과로 다음을 수행합니다.
!24:s/FOO/BAR/
답변2
별칭에 변수 할당을 넣을 수 있습니다.
alias shellvars1='FOO=bar '
alias shellvars2='BAZ=qxt '
변수 끝에 있는 공백은 별칭 확장을 위해 후속 단어도 고려하도록 쉘에 지시합니다. 예를 들어 가 별칭인 경우 를 a
실행 합니다 .somecommand --option
shellvars1 shellvars2 a wibble
FOO=bar BAZ=qxt somecommand --option a
기능을 사용할 수도 있습니다. 할당이 고정된 경우 별칭을 사용하고, 더 많은 유연성(예: 조건부 할당)을 원하면 함수를 사용하세요.
shellvars1 () {
local tmp=2
FOO=$((tmp + tmp)) "$@"
}
…
shellvars1 mycommand
변수를 함수에 대한 로컬 변수로 설정할 수도 있습니다. 변수가 함수에 대해 로컬인 경우 export
지시어도 해당 함수의 범위로 제한됩니다.
shellvars1 () {
local FOO=bar
export FOO
"$@"
}