
및 다음 GtkDialog
에서 경고를 표시하지 않으려고 합니다 .zenity
yad
$ zenity --error --text hello
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
오류 리디렉션 및 필터링이 작동합니다.
$ zenity --error --text hello 2> >(grep -v GtkDialog >&2)
응...귀찮은 경고 메시지가 사라집니다!!
~/.bashrc
여기에 답변된 대로 개발 작업을 위해 배치할 수 있습니다 .
그리고 여기:
하지만 다른 사람들이 사용할 스크립트를 만들 때, 그들이 자신의 ~/.bashrc
.
2> >(grep -v GtkDialog >&2)
스크립트 내에서 사용할 입력 바로가기를 만드는 데 문제가 있습니다 .
여러 가지 이유로 변수 할당과 GTK_SPAM="2> >(grep -v GtkDialog >&2)"
나중에 변수 사용이 "$GTK_SPAM"
작동하지 않습니다.
alias zenity="zenity 2> >(grep -v GtkDialog >&2)"
스크립트를 호출하기 전에는 작동하지만 스크립트 내에서는 사용할 수 없습니다.
배열을 사용하여 입력 단축키를 유지하는 것이 작동하지 않습니다.
$ aGtkSpam=(2\> \>\(grep -v GtkDialog \>\&2\))
$ DumpArray "${aGtkSpam[@]}"
Array Elements:
0: 2>
1: >(grep
2: -v
3: GtkDialog
4: >&2)
$ zenity --error --text hello "${aGtkSpam[@]}"
This option is not available. Please see --help for all possible usages.
$ yad --text hello 2> >(grep -v GtkDialog >&2)
$ yad --text hello "${aGtkSpam[@]}"
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
나는 단어 분할과 매개변수에 대해 훌륭한 일반적인 답변을 많이 찾았습니다.~해야 한다내 문제를 해결했지만 특정 구문을 찾을 수 없습니다.
어떤 단서가 있나요?
답변1
쉘이 리디렉션을 설정하고 변수를 확장하는 순서 때문에 구문만으로는 도움이 될 수 없다고 생각합니다. 매우 간단한 예를 들면 다음과 같습니다.
$ arr=( ">" "/dev/null" )
$ set -x
$ echo foo "${arr[@]}"
+ echo foo '>' /dev/null
foo > /dev/null
즉, 모든 것이 "올바르게" 확장되었지만 > /dev/null
단순히 에 전달된 문자열 인수 목록이 되었습니다 echo
.
너~할 수 있었다다음을 사용한 힘 평가 eval
:
$ eval echo foo "${arr[@]}"
+ eval echo foo '>' /dev/null
++ echo foo
하지만 실제로는 다음을 사용하여 스크립트 기간 동안 스트림을 리디렉션하는 것이 더 좋습니다 exec
.
exec 2> >(grep -v GtkDialog >&2)
또는 스크립트가 끝나기 전에 필터를 끄려면 다음을 기반으로 합니다.을 사용한 후 exec 1>file
STDOUT의 파일 리디렉션을 중지하고 STDOUT의 정상적인 작동을 복원하려면 어떻게 해야 합니까?할 수 있어야 한다
exec 3>&2 2> >(grep -v GtkDialog >&2)
그리고 나중에
exec 2>&3 3>&-
중복된 스트림을 복구합니다.
답변2
쉘 옵션을 설정하면 스크립트에서 별칭을 정의하고 사용할 수 있습니다 expand_aliases
. 예:
#!/bin/bash
shopt -s expand_aliases
alias zenity='zenity 2> >(grep -v GtkDialog >&2)'
…
이제 모든 zenity
줄은 추가된 것처럼 동작하며 2> >(grep -v GtkDialog >&2)
백슬래시 또는 다음을 추가하여 평소처럼 이 동작을 비활성화할 수 있습니다 command
.
\zenity # and
command zenity
둘 다 별칭을 무시합니다.
추가 읽기
답변3
스크립트에서 함수를 사용할 수 있습니다. stdout에 유용한 정보가 zenity
있으므로 yad
stderr만 다음으로 리디렉션하는 것이 좋습니다./dev/null
#/bin/bash
zen_nospam() {
zenity "$@" 2&>1 >(grep -v GtkDialog >&2)
}
zen_nospam --error --text hello
btw 함수는 필요한 경우 스크립트가 아닌 명령줄에서 .bashrc에 정의할 수 있습니다.