時には、クリップボードにファイルや文字列のリストがあり、引数リストとして bash シェルに貼り付けたい場合があります。
サンプルファイルのリスト(例のみ):
createsnapshot.sh
directorylisting.sh
fetchfile.sh
私が望むもの:
md5sum createsnapshot.sh directorylisting.sh fetchfile.sh
現在、次のハッキングコマンドラインを入力します(ファイル名はクリップボードに貼り付けられており、リストには数十行を含めることができます)。
md5sum $(echo $(echo "
createsnapshot.sh
directorylisting.sh
fetchfile.sh
"))
これにはいくつかの欠点があります。
- 複雑
- 良く見えない
- スペースを含む行はサポートされていません。
他にどのようなオプションがありますか?md5sum "
この場合、複数行の文字列を持つパラメータのみを取得するため、機能しません。ここの記事に似ています。
必ずしもそうではありませんmd5sum
。tar
または、git add
どちらでもかまいませんdu -hsc
。私はこれらのファイルのmd5チェックサムを取得する方法を要求するだけではありません。このようなことが1日2〜5回程度起こります。
答え1
バックティック呼び出しなどの変数やダミー変数を引用しない場合(例$(xclip -selection c -o)
:この場合(クリップボードの内容を最初に確認してください))、必要なものは次のとおりです。$IFS
\t
\n
md5sum `xclip -selection c -o`
メモ:
必要なコマンドの周りに短い名前のラッパーを置くことは非常に便利ですxclip
。
私は使う
#!/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
これにより、コンテンツを入力してcb
クリップボードにアクセスしてsomething | cb
コンテンツを作成できます。
DISPLAY
(私が外にTTY_DASHED
いるなら.profile
export TTY_DASHED=$(tty |tr / - | tail -c+2)
答え2
コマンドがuseを使用していない場合は、入力を読み取って引数に変換するstdin
itを使用してください(コマンドの作成方法を示すためにこのコマンドを使用していることに注意してください)。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
スペースを含むファイル名を確実に処理する必要があります。
答え3
ファイル名を含む変数を設定できます。次に、コマンドでその変数を使用します。
$ #VAR='<paste filenames>':
$ VAR='createsnapshot.sh
> directorylisting.sh
> fetchfile.sh'
$ touch $VAR
$ ls -l $VAR
-rw-r--r-- 1 testuser testuser 0 nov 26 12:47 createsnapshot.sh
-rw-r--r-- 1 testuser testuser 0 nov 26 12:47 directorylisting.sh
-rw-r--r-- 1 testuser testuser 0 nov 26 12:47 fetchfile.sh
$ md5sum $VAR
d41d8cd98f00b204e9800998ecf8427e createsnapshot.sh
d41d8cd98f00b204e9800998ecf8427e directorylisting.sh
d41d8cd98f00b204e9800998ecf8427e fetchfile.sh
$ tar cf archive.tar $VAR
$ tar tf archive.tar
createsnapshot.sh
directorylisting.sh
fetchfile.sh
注:$VAR
行末のため引用符なしで呼び出す必要があります。VAR=$(echo "$VAR"|tr '\n' ' ') to be able to use quoted
$ VAR`の使用を検討することができます。
上記に基づいた別のアプローチは、インクルードに~/.bashrc
関数を書くことです。
fVAR ()
{
VAR="$@";
VAR=$(echo "$VAR"|tr '\n' ' ')
}
関数はクリップボードの内容として呼び出され、fVAR
値は以下にあります$VAR
。
$ fVAR '<paste filenames>'
$ md5sum "$VAR"
答え4
set --
while IFS= read -r in
do set -- "$@" "$in"
done
...それからあなたのシフト挿入キー、それからCtrl+D一度(または2回)すると、貼り付けの各行を文字通り所有できます。(NULなし)in$1
など$2
があり、$3
入力配列全体は$IFS
inの最初の文字に関連付けられた単一の文字列、"$*"
または別々の文字列のリストとして扱うことができます"$@"
。つまり、次のことができます。
md5sum -- "$@"
…有用なインタラクティブな速記を探しているからです。
alias rdcb='
[ -t 0 ] && set -- &&
while IFS= read -r in
do set -- "$@" "$in"
done'
...alias
対話式シェルで実行できるコマンドを定義して、シェルの引数を標準入力から改行区切りの配列に設定します。
だから...
{ ls -1 | xsel -bi #pipes ls output into my clipboard
rdcb #terminal hangs, shift+insert && crtl+d
xsel -bo #writes my clipboard to stdout
printf %s\\n '' --- '' "$@" #writes \n-delimited shell arg array
printf %s\\n '' --- '' "$3" "$5" #writes only args "$3" and "$5"
}
1
edit.sh
paccache
sh
systemd-private-75115542eb544b09bc245e8ca7765854-systemd-timesyncd.service-CKruFk
sztally
yaourt-tmp-mikeserv
---
1
edit.sh
paccache
sh
systemd-private-75115542eb544b09bc245e8ca7765854-systemd-timesyncd.service-CKruFk
sztally
yaourt-tmp-mikeserv
---
paccache
systemd-private-75115542eb544b09bc245e8ca7765854-systemd-timesyncd.service-CKruFk
より良いバージョンは次のとおりです。
alias rdcb='
if [ -t 0 ]
then set -f -- "$IFS" "${IFS+IFS=\$1;} set +f -$-
stty $(stty -g; stty raw -echo min 1 time 2)"
IFS=$(printf \\r)
set -- "$@" $(dd bs=4k count=1 2>/dev/null)
eval "unset IFS;$2;shift 2"
fi '
端末エコーと端末特殊文字処理を放棄し、必要ありません。Ctrl+D入力が終了したことを示します。実行するすべての操作は一時的で、影響を受けるすべての設定を完了したときに検出した状態に慎重に復元します。もちろん、設計によって永久に変更されるシェルのパラメータは除外されます。
こうしてrdcb
貼り付けるだけで終わりです。貼り付けると画面に出力がありません。端末が停止し、10分の1秒以内に少なくとも1バイトを入力すると、プロンプトが再表示されます。その後、以前と同様にパラメータを処理できます。