Shell-Script

是否有在沒有重定向、管道或函式的情況下將文本寫入文件的命令?

  • October 23, 2020

管道和重定向是 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 在自己的空間中執行並且不辨識該函式。

因此我的問題

因此,我想要一個類似的命令echocat或者printf將輸出文件作為參數而不是重定向。我已經搜尋過這樣的命令,但找不到。

當然,我可以自己編寫並將其放在預設路徑中:

FILENAME="${1}"
shift
printf '%s\n' "${*}" >"${FILENAME}"

接著

yad --notification --command=quit --menu='Example!myscript text.txt sample'

但是,如果 Linux 還沒有這樣的東西,我確實會感到驚訝!

謝謝

這是一個XY 問題,但幸運的是,您已經解釋了您的真正問題,因此可以給出有意義的答案。

當然,有些命令可以將文本寫入文件,而無需依賴其環境來打開文件。例如,sh可以這樣做:將參數-cecho 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 >filenameprints >filename,而不是 write to filename,這不是 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'"

引用自:https://unix.stackexchange.com/questions/615485