Bash

在 bash 中以互動方式逐行添加參數

  • November 26, 2015

有時,我在剪貼板中有一個文件或字元串列表,並希望將其作為參數列表粘貼到 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。它也可以是tarorgit adddu -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

使用xargswith -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)`
)`

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