是否有在沒有重定向、管道或函式的情況下將文本寫入文件的命令?
管道和重定向是 Linux 中最強大的兩個功能,我喜歡它們。
但是,我遇到了一種情況,即我需要在不使用管道、重定向或函式的情況下將一段固定的文本寫入文件。
我正在使用 Bash 以防萬一。
第一:為什麼?
如果有更簡單的解決方案,我將解釋原因。
我有一個帶有一些菜單條目的背景 yad 通知。在某些菜單條目中,我希望通知將一段固定的文本寫入文件。這是我的意思的一個例子。
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 還沒有這樣的東西,我確實會感到驚訝!
謝謝
這是一個XY 問題,但幸運的是,您已經解釋了您的真正問題,因此可以給出有意義的答案。
當然,有些命令可以將文本寫入文件,而無需依賴其環境來打開文件。例如,
sh
可以這樣做:將參數-c
和echo text >filename
.請注意,這確實滿足此處“無重定向”的要求,因為 的輸出
sh
不會在任何地方重定向。執行的程序內部有一個重定向sh
,但這沒關係,它只是如何sh
工作的內部細節。但這能解決您的實際問題嗎?您的實際問題是通過 yad 操作將文本寫入文件。為了解決這個問題,您需要確定什麼是 yad 操作。不幸的是,該手冊沒有記錄這一點。它只說
menu:STRING
設置通知圖示的彈出菜單。
STRING
必須是形式name1[!action1[!icon1]]|name2[!action2[!icon2]]...
。空名稱將分隔符添加到菜單。帶有參數的值(例如|
)集的分隔符。帶有參數--separator
的菜單項(例如!
)集的分隔符。--item-separator
動作是字元串,但 Unix 命令是字元串列表:命令名稱及其參數。有幾種可行的方法可以將字元串轉換為命令名稱及其參數,包括:
- 將字元串視為命令名稱並在不帶參數的情況下呼叫它。由於
echo foo
列印foo
,而不是嘗試執行程序echo foo
,這不是 yad 所做的。- 將字元串傳遞給 shell。由於
echo >filename
prints>filename
,而不是 write tofilename
,這不是 yad 所做的。- 一些自定義字元串拆分。在這一點上,這大概是 yad 所做的,但取決於它的具體做法,您的問題的解決方案可能會有所不同。
查看原始碼,操作被傳遞給
popup_menu_item_activate_cb
呼叫 Glib 函式g_spawn_command_line_async
。此函式使用具有以下行為的給定字元串拆分g_shell_parse_argv
,這幾乎不是可取的,但可以解決:將命令行解析為參數向量,與 shell 的方式大致相同,但沒有 shell 將執行的許多擴展(不支持變數擴展、glob、運算符、文件名擴展等)。只要輸入不包含任何不受支持的 shell 擴展,結果就被定義為與您從 UNIX98 /bin/sh 獲得的結果相同。如果輸入確實包含此類擴展,則它們會按字面意思傳遞。
sh -c '
因此,您可以通過以 . 為前綴並以 . 結尾來執行 shell 命令'
。如果您需要在 shell 命令中使用單引號,請編寫'\''
. 或者,您可以執行 shell 命令,方法是在命令中添加前綴sh -c "
、終止並在命令中出現的"
任何字元之前添加反斜杠。`"$``注意嵌套引用,因為該操作本身在呼叫 yad 的 shell 腳本中被引用。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'"