내 ~./bashrc
별칭에서는 더 이상 이와 같은 와일드카드를 사용하지 않습니다.
alias x='set -f;. any.sh'
그러나 와일드카드를 다시 활성화하는 명령은 무엇입니까? 아니면 이 옵션을 어디에서 설정해야 합니까 any.sh
?
어떤 답변이라도 환영합니다.
답변1
any.sh
bash4.4+
쉘이 , with 또는 - 기반의 쉘에서 코드를 해석할 때만 glob을 비활성화 하려면 ash
다음을 수행할 수 있습니다.
x() {
local -
set -o noglob
. any.sh
}
또는 zsh
:
x() {
set -o localoptions -o noglob
. any.sh
}
즉, 별칭보다는 함수를 사용하십시오(여러 명령에 별칭을 사용하면 원하는 대로 작동하지 않으므로 별칭을 사용하고 싶지는 않습니다 cmd | x
) . ( 변경 방법으로) cmd && x
옵션을 변경해야 합니다. $-
참조) 로컬 기능을 사용하고 glob을 비활성화하고 파일을 가져옵니다.
이전 버전에서는 bash
다음을 수행할 수 있습니다.
x() {
local ret restore
[[ $- = *f* ]] || restore='set +o noglob'
set -o noglob
. any.sh
ret=$?
eval "$restore"
return "$ret"
}
아니면 다음과 같은 좀 더 일반적인 도우미 기능을 사용할 수도 있습니다.
withopt() {
local ret option
local -a restore
option=$1; shift
[[ -o $option ]] || restore=(set +o "$option")
set -o "$option"
"$@"
ret=$?
"${restore[@]}"
return "$ret"
}
그런 다음 원하는 경우 별칭을 사용할 수 있습니다.
alias x='withopt noglob . any.sh'
*
이렇게 하면 확장 프로그램이 차단되지 않습니다 .
x *
이 noglob
옵션은 명령이 평가된 지 오랜 후에 최종적으로 활성화되기 때문입니다. 이렇게 하려면 다음을 참조하세요.내 다른 답변(다양한 질문에 대한 답변).
답변2
이는 질문이 명확해지기 전에 게시되었으며 이제는 다른 요구 사항을 해결합니다. 다른 사람들에게 유용할 수 있기 때문에 여기에 남겨둡니다.
나는 당신이 할 수 있기를 원한다고 생각합니다 :
x *.txt
*.txt
확장되지 않은 후 any.sh
다시 활성화된 glob이 전달됩니다.
이 작업을 수행하는 데 사용할 수 없습니다 bash
. zsh
다음과 같은 경우에 사용하세요.
alias x='noglob any.sh`
noglob
명령의 별칭 만 비활성화됩니다.
$ echo /etc/p*d
/etc/pam.d /etc/passwd /etc/profile.d
$ noglob echo /etc/p*d
/etc/p*d
echo
이 명령에 대한 인수의 전역 확장에만 영향을 미칩니다. 또는 또는 대신 *
계속 확장 됩니다.noglob echo $(echo *)
noglob eval 'echo *'
noglob . some-script
some-script
echo *
실제로 다음과 같은 방법이 있을 수 있습니다 bash
.
oneshot_noglob() {
case $- in
(*f*) ;; # globs already disabled
(*) set -f; shot=0; debug_trap=$(trap -p DEBUG)
trap '
if ((++shot == 2)); then
set +f
trap - DEBUG
'"$debug_trap"'
fi' DEBUG;;
esac
}
alias x='oneshot_noglob; any.sh'
set +f
NET에서 DEBUG 트랩을 사용합니다 set -f
.
이제 여러 명령이 포함된 모든 별칭에 대해 몇 가지 고려 사항이 있습니다.
echo foo | x
이 되다:
echo foo | oneshort_noglob; any.sh
따라서 출력은 echo
에만 공급됩니다 oneshort_noglob
.
다음과 같은 경우에도 마찬가지입니다.
cmd && x
any.sh
성공이나 실패에 관계없이 cmd
어디에서나 실행됩니다 .
또한 두 번째 명령이 기본 셸 프로세스에서 실행될 때까지 모든 수준의 하위 셸에 있는 모든 glob에 영향을 미칩니다.
예를 들어 에서는 x $(echo *; echo *) *
해당 옵션이 설정되지 않으면 DEBUG 트랩이 상속되지 않으므로 *
이들 중 어느 것도 확장되지 않습니다 .extdebug
답변3
사람들은 일시적으로 무언가를 변경한 다음 이전 상태로 복원하려고 시도할 수 있습니다. 그러나 나는 더 좋고, 더 깨끗하고, 더 안정적이고, 유지하기 쉬운 방법을 제안합니다.필요한 사항을 로컬에서 변경하기만 하면 됩니다..
Bash
다음을 사용하면 쉽게 이를 달성할 수 있습니다.서브쉘(자세한 내용은 여기에서 확인하세요 -그룹화 명령).
귀하의 경우에는 할 수 있습니다
alias x='( set -f;. any.sh ; )'
답변4
여러 설정을 시도한 후에도 bash 쉘 스크립트에서 glob이 작동하도록 할 수 없습니다. 대신 CLI에 glob을 배치했는데 예상대로 작동했습니다.
이것이 작동하지 않기 때문에:
sh ./test.sh file ls "${1}*.ppm"
다음으로 바꾸세요:
sh ./test.sh file f*.ppm ls ${2}
질문에 대한 직접적인 대답은 아니지만 유사한 상황에 대한 유용한 대안입니다.