Bash
在 bash 中以互動方式逐行添加參數
有時,我在剪貼板中有一個文件或字元串列表,並希望將其作為參數列表粘貼到 bash shell 中:
範例文件列表(僅作為範例):
createsnapshot.sh directorylisting.sh fetchfile.sh
我想要的是:
md5sum createsnapshot.sh directorylisting.sh fetchfile.sh
目前,我輸入以下 hacky 命令行(文件名是從剪貼板粘貼的;列表可以包含幾十行):
md5sum $(echo $(echo " createsnapshot.sh directorylisting.sh fetchfile.sh "))
這有幾個缺點:
- 這很複雜
- 看起來不太好
- 它不支持包含空格的行
我還有什麼其他選擇?
md5sum "
不起作用,因為在這種情況下,我只得到一個帶有多行字元串的參數。與此處的文件類似。並非總是如此
md5sum
。它也可以是tar
orgit add
或du -hsc
。我不只是要求一種方法來獲取這些文件的 md5 校驗和。這種情況每天大約發生 2-5 次。
如果命令不使用
stdin
,請使用xargs
,它讀取輸入並將其轉換為參數(請注意,我使用echo
命令來顯示如何xargs
建構命令):$ xargs echo md5sum # paste text createsnapshot.sh directorylisting.sh fetchfile.sh # press Ctrl-D to signify end of input md5sum createsnapshot.sh directorylisting.sh fetchfile.sh
使用
xargs
with-d '\n'
,以便將每一行作為一個完整的參數,儘管有空格:$ xargs -d'\n' md5sum # paste a file with spaces afilewithoutspaces foo " " bar # Ctrl D md5sum: a file with spaces: No such file or directory md5sum: afilewithoutspaces: No such file or directory md5sum: foo " " bar: No such file or directory
如您所見,
md5sum
列印每個文件名的錯誤,而不考慮文件名中的其他空格。如果您願意使用
xclip
,那麼您可以通過管道或其他方式將其提供給 xargs:xargs -a <(xclip -o) -d '\n' md5sum xclip -o | xargs -d '\n' md5sum
這應該可靠地處理帶有空格的文件名。
如果您不引用變數或虛擬變數,例如反引號呼叫,例如
$(xclip -selection c -o)
(輸出 X 剪貼板的內容),shell 將$IFS
預設將內容拆分為\t
\n
和, and it will expand globs present in the contents. In this case (make sure you inspect the contents of your clipboard first), that is what you want:
md5sum `xclip -selection c -o` ``` --- **Note:** It's quite handy to have a shortly named wrapper around the `xclip` commands you need. I use ``` #!/bin/sh #filename: cb if [ -n "$DISPLAY" ]; then [ -t 0 ] && exec /usr/bin/xclip -selection c -o 2>/dev/null /usr/bin/xclip -selection c else [ -t 0 ] && exec cat "/dev/shm/$TTY_DASHED" cat > /dev/shm/"$TTY_DASHED" fi ``` which allows me to type `cb` to access the clipboard and `something | cb` to write to it. ( I use an in-memory file named after my terminal as my clipboard if I'm outside of X (=if `DISPLAY` isn't set). The `TTY_DASHED` env variable gets set in my `.profile` as with `export TTY_DASHED=$(tty |tr / - | tail -c+2)` )`