Bashでインタラクティブにパラメータを1行ずつ追加します。

Bashでインタラクティブにパラメータを1行ずつ追加します。

時には、クリップボードにファイルや文字列のリストがあり、引数リストとして bash シェルに貼り付けたい場合があります。

サンプルファイルのリスト(例のみ):

createsnapshot.sh
directorylisting.sh
fetchfile.sh

私が望むもの:

md5sum createsnapshot.sh directorylisting.sh fetchfile.sh

現在、次のハッキングコマンドラインを入力します(ファイル名はクリップボードに貼り付けられており、リストには数十行を含めることができます)。

md5sum $(echo $(echo "
createsnapshot.sh
directorylisting.sh
fetchfile.sh
"))

これにはいくつかの欠点があります。

  • 複雑
  • 良く見えない
  • スペースを含む行はサポートされていません。

他にどのようなオプションがありますか?md5sum "この場合、複数行の文字列を持つパラメータのみを取得するため、機能しません。ここの記事に似ています。

必ずしもそうではありませんmd5sumtarまたは、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いるなら.profileexport TTY_DASHED=$(tty |tr / - | tail -c+2)

答え2

コマンドがuseを使用していない場合は、入力を読み取って引数に変換するstdinitを使用してください(コマンドの作成方法を示すためにこのコマンドを使用していることに注意してください)。xargsechoxargs

$ 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とおり、ファイル名の他のスペースに関係なく、すべてのファイル名に対してエラーが出力されます。

を使用するには、xclipxargsにパイプまたは提供することができます。

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入力配列全体は$IFSinの最初の文字に関連付けられた単一の文字列、"$*"または別々の文字列のリストとして扱うことができます"$@"。つまり、次のことができます。

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バイトを入力すると、プロンプトが再表示されます。その後、以前と同様にパラメータを処理できます。

関連情報