스크립트에서 Bash 리디렉션을 사용하여 zenity 및 yad에서 GtkDialog 경고를 억제하려면 어떻게 해야 합니까?

스크립트에서 Bash 리디렉션을 사용하여 zenity 및 yad에서 GtkDialog 경고를 억제하려면 어떻게 해야 합니까?

및 다음 GtkDialog에서 경고를 표시하지 않으려고 합니다 .zenityyad

$ 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>fileSTDOUT의 파일 리디렉션을 중지하고 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있으므로 yadstderr만 다음으로 리디렉션하는 것이 좋습니다./dev/null

#/bin/bash

zen_nospam() {
  zenity "$@" 2&>1 >(grep -v GtkDialog >&2)
}

zen_nospam --error --text hello

btw 함수는 필요한 경우 스크립트가 아닌 명령줄에서 .bashrc에 정의할 수 있습니다.

관련 정보