파이프와 리디렉션은 Linux의 가장 강력한 기능 중 두 가지이며 저는 이를 좋아합니다.
그러나 파이프, 리디렉션 또는 함수를 사용하지 않고 파일에 고정 텍스트를 써야 하는 상황에 직면했습니다.
만일을 대비해 Bash를 사용합니다.
첫째: 왜요?
더 간단한 해결책이 있다면 그 이유를 설명하겠습니다.
일부 메뉴 항목이 포함된 배경 야드 알림이 있습니다. 일부 메뉴 항목에서는 파일에 고정 텍스트를 쓰라는 알림을 원합니다. 내가 의미하는 바의 예는 다음과 같습니다.
yad --notification --command=quit --menu='Example!echo sample >text.txt'
문제는 yad가 리디렉션을 허용하지 않기 때문에 실제로 sample >text.txt
리디렉션 대신 문자열을 인쇄한다는 것입니다.
마찬가지로 파이프 기호( |
)는 yad의 구분 기호이지만 이를 변경하면 yad는 이를 리터럴 문자로 처리합니다. 예를 들어:
yad --notification --command=quit --separator='#' --menu='Example!echo sample | tee text.txt'
sample | tee text.txt
이는 실제로 파이프 대신 문자열을 인쇄합니다 .
yad가 자체 공간에서 실행되고 함수를 인식하지 못하기 때문에 yad가 호출할 함수를 작성하는 것도 의미가 없습니다.
그러므로 내 질문
echo
따라서 나는 출력 파일을 리디렉션하는 대신 매개변수로 사용하는 cat
것과 같은 명령을 원합니다. printf
해당 명령을 검색했지만 찾을 수 없습니다.
물론 직접 작성하여 기본 경로에 넣을 수도 있습니다.
FILENAME="${1}"
shift
printf '%s\n' "${*}" >"${FILENAME}"
그런 다음
yad --notification --command=quit --menu='Example!myscript text.txt sample'
그러나 Linux에 아직 이와 같은 기능이 없다면 정말 놀랄 것입니다!
감사해요
답변1
이건 좀XY 문제하지만 다행히 실제 문제를 설명해주셔서 의미 있는 답변을 드릴 수 있었습니다.
물론 파일을 여는 환경에 의존하지 않고 파일에 텍스트를 쓸 수 있는 명령이 있습니다. 예를 들어 sh
다음과 같이 할 수 있습니다. 매개변수 -c
및 를 전달합니다 echo text >filename
.
이 점에 유의하시기 바랍니다하다의 출력이 sh
어디로도 리디렉션되지 않으므로 여기서 "리디렉션 없음" 요구 사항을 충족합니다. 실행 중인 프로그램 내부에 리디렉션이 있지만 sh
괜찮습니다. sh
작동 방식에 대한 내부 세부 정보일 뿐입니다.
하지만 이것이 실제 문제를 해결합니까? 실제 문제는 야드 작업에서 파일에 텍스트를 쓰는 것입니다. 이 문제를 해결하기 위해서는 야드 운용이 무엇인지를 알아야 한다. 안타깝게도,수동이것은 문서화되어 있지 않습니다. 그게 말하는 전부야
menu:STRING
알림 아이콘의 팝업 메뉴를 설정합니다.
STRING
형태로 되어 있어야 합니다name1[!action1[!icon1]]|name2[!action2[!icon2]]...
. 이름이 비어 있으면 메뉴에 구분 기호가 추가됩니다. 값 구분 기호(예|
: )는 매개변수를 사용하여 설정됩니다--separator
. 메뉴 항목의 구분 기호(예!
: )는 매개변수를 사용하여 설정됩니다--item-separator
.
작업은 문자열이지만 Unix 명령은 명령 이름과 인수 등 문자열 목록입니다. 문자열을 명령 이름과 해당 인수로 변환하는 방법에는 다음을 포함하여 여러 가지가 있습니다.
- 문자열을 명령 이름으로 처리하고 인수 없이 호출합니다. 프로그램을 실행하는 대신
echo foo
인쇄를 하기 때문에 yad는 그런 일을 하지 않습니다.foo
echo foo
- 문자열을 셸에 전달합니다.
echo >filename
인쇄하는>filename
것은 쓰는 것이 아니기 때문에filename
이것은 yad가 하는 일이 아닙니다. - 일부 사용자 정의 문자열 분할. 이 시점에서 이것은 대략 yad가 수행하는 작업이지만 정확히 수행하는 방법에 따라 문제에 대한 해결책이 다를 수 있습니다.
보고 있다소스 코드, 작업이 다음으로 전달됩니다.popup_menu_item_activate_cb
Glib 함수를 호출합니다.g_spawn_command_line_async
. 이 함수는 다음을 사용하여 주어진 문자열을 분할합니다.g_shell_parse_argv
다음과 같은 동작이 있는데, 이는 우리가 원하는 것과 거의 다르지만 해결할 수 있습니다.
셸과 거의 동일한 방식으로 명령줄을 인수 벡터로 구문 분석하지만 셸이 수행하는 많은 확장이 없습니다(변수 확장, 와일드카드, 연산자, 파일 이름 확장 등은 지원되지 않음). 입력에 지원되지 않는 셸 확장이 포함되지 않는 한 결과는 UNIX98 /bin/sh에서 얻은 결과와 동일하도록 정의됩니다. 입력에 이러한 확장이 포함되어 있으면 문자 그대로 전달됩니다.
sh -c '
따라서 접두사를 추가하고 '
. 로 끝나서 셸 명령을 실행할 수 있습니다. 쉘 명령에서 작은따옴표를 사용해야 하는 경우 를 작성하십시오 '\''
. 또는 앞에 를 붙이고 로 끝내고 sh -c "
명령에 나타나는 문자 앞에 백슬래시를 추가하여 셸 명령을 실행할 수 있습니다. 조치 자체가 yad를 호출하는 쉘 스크립트에서 참조되므로 중첩된 참조에 유의하십시오."
"$\`
yad --notification \
--menu='Simple example!sh -c "echo sample text >text.txt"' \
--menu='Single-double-single quotes!sh -c "echo '\''Here you can put everything except single quotes literally: two spaces, a $dollar and a single'\''\'\'''\''quote.'\'' >text.txt"' \
--menu="Double-single-double quotes!sh -c 'echo \"Here punctuation is a bit tricky: two spaces, a \\\$dollar and a single'\\''quote.\"' >text.txt'"
답변2
셸의 기능을 사용하려면 셸을 실행하세요.
yad --notification --command=quit --menu='Example!sh -c "echo sample >text.txt"'
답변3
간단한 사용자 정의 스크립트는 다음과 같습니다 printto.py
.
#!/usr/bin/python
import sys
if len(sys.argv) == 3:
f = open(sys.argv[1], "w")
f.write(sys.argv[2])
f.close()
else :
print("usage: printto.py file message")
sys.exit(1)
답변4
"yad"가 괄호 안의 하위 프로세스/하위 쉘로 실행되는지, 하위 프로세스에서 리디렉션이 가능한지 알고 싶습니다.
( yad BLAH BLAH BLAH ) > output.txt
또는
( yad BLAH BLAH BLAH ) >& output.txt