
➜ ~ cat .zshrc | grep xclip
alias c="xclip -selection c"
alias -g v='"$(xclip -selection c -o)"'
➜ ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png
➜ ~
「該当するファイルもディレクトリもありません」とは、中国語で「ファイルもディレクトリもありません」という意味です。
にあるファイルをコピーしたいです/home/roach/Downloads/pure.png
。 Dolphin KDEで選択してコピーするとき(右クリックしてからコピーをクリック)、上記の代わりに/home/roach/Downloads/pure.png
それを取得する方法はありますか?file:///home/roach/Downloads/pure.png
sed
追加の文字を削除するfile://
などのコマンドを使用していると思いましたが、正しい方法を取得できませんでした。
➜ ~ alias -g v='"$(xclip -selection c -o)|sed -e 's/file:\/\///'"'
➜ ~ v
zsh: 没有那个文件或目录: file:///home/roach/Downloads/pure.png|sed -e s/file:////
➜ ~
それでは、私のものをどのように修正しますかalias -g v
?
答え1
シェル自体がこれらの交換を実行できるため、外部プログラムのより高価なフォークや実行を回避できます。詳しくは、「パラメータの拡張」を参照してくださいzshexpn(1)
。
% x=file:///etc/passswd; print ${x#file://}
/etc/passswd
だからあなたの場合は、おそらく次のようになります。
% alias -g v='${$(xclip -selection c -o)#file://}'
% print -l v
/etc/passswd
これはv
やや一般的な文字なので、グローバルエイリアスとしては適していない可能性があります。
名前にスペースが含まれる項目の処理方法を決定することもできます。print -l
次の項目の違いが明らかになります。
alias -g v='${$(xclip -selection c -o)#file://}'
alias -g v='${"$(xclip -selection c -o)"#file://}'
クリップボードの内容にスペースがある場合。
答え2
ご存知のように、エイリアスは
alias -g v='"$(xclip -selection c -o)"'
つまり、 を呼び出すと、v
シェルはクリップボードコンテンツというコマンドを実行しようとします。これが最初のコードスニペットで起こることです。しかし、v
その効果を呼び出して観察することは、意図された用途のために誤解を招く可能性があります。グローバルエイリアスは他のコマンドの引数です。
sed
コマンドの置き換え()を使用して正しく引用すると、ベースのソリューションが機能します。$(...)
alias -g v='$(xclip -selection clipboard -o | sed '"'"'s|^file://||'"'"')'
ここでxclip
クリップボードの内容が にパイプされ、先頭が削除されますsed
(file://
パターンが固定されています^
)。スクリプトでコマンド区切り文字を使用しないと、/
読みやすくなり、パターンからエスケープする必要がなくなります。コマンド置換は、パイプの出力が呼び出された場所で置き換えられることを意味します。s
sed
/
v
その後、次のように使用できます。
cp -- v /path/to/destination
v
リテラルはv
常に置き換えられるため、現在の作業ディレクトリに名前が付けられているファイルを操作するのが難しくなります。回避策として相対パスを使用できます./v
。
(また、いくつかのプログラムはプレフィックスなしで単一文字オプションを受け入れることを考慮してください。これは完全に正当ですが、POSIXではありません。ps v
単一文字グローバルエイリアスは安全ではありません。)
最後に、これらのグローバルエイリアスは、名前に空白文字が含まれるファイルでは機能しません。エイリアスを変更した後、シェルによって分割されるからです。
あるいは、グローバルエイリアスの使用を避け、以下を定義することもできます。
alias v="xclip -selection clipboard -o | sed 's|^file://||'"
次のように使用できます。
cp -- "$(v)" /path/to/destination
これは、スペース文字を含むファイル名にも適用されます。
しかし、注意してください:
- 次の説明に従って、シェルの代替機能を活用してください。トリガーの答え、効率が高くなります。
Dolphinが表示してクリップボードにコピーしたファイル名はエンコードされているため、珍しい文字が含まれている限り、シェルでの使用には適していません。たとえば、
touch $'file with a\nnewline' # Copied in Dolphin % echo "$(v)" file with a%0Anewline % cat "$(v)" cat: '/path/to/file with a%0Anewline': No such file or directory