와일드카드를 켜고 끄는 방법은 무엇입니까?

와일드카드를 켜고 끄는 방법은 무엇입니까?

~./bashrc별칭에서는 더 이상 이와 같은 와일드카드를 사용하지 않습니다.

alias x='set -f;. any.sh'

그러나 와일드카드를 다시 활성화하는 명령은 무엇입니까? 아니면 이 옵션을 어디에서 설정해야 합니까 any.sh?

어떤 답변이라도 환영합니다.

답변1

any.shbash4.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-scriptsome-scriptecho *

실제로 다음과 같은 방법이 있을 수 있습니다 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 +fNET에서 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}

질문에 대한 직접적인 대답은 아니지만 유사한 상황에 대한 유용한 대안입니다.

관련 정보