2

怠け者の unix/linux コマンド ライン ユーザーである私は、タイプ入力を避けるためにかなりの数の小さなシェル スクリプトを使用しています。

たとえばlst、現在のディレクトリにある最新のファイルの名前を出力するスクリプトがあります。これが呼び出されmytextて入力すると、emacs で開きemacs `lst`ますmytext

ただし、最新のファイルが呼び出されmy textemacs `lst`場合、シェルはこのコマンドを次のように解釈するため、失敗しemacs my textます。emacs my\ text

のように引用符を使用emacs "`lst`"すると問題は解決しますが、キーストロークが 2 回余分に必要になります。

lst余分なキーストロークなしでコマンドが機能するように変更する方法はありますか? バックスラッシュでエスケープされたファイル名の出力は機能しません。

私は を使用zshしますが、問題 (そしてできれば解決策) は同じですbash

4

2 に答える 2

1

怠惰な関数をキーバインドして、何も入力しないようにします。Ctrl+を押して、コマンドラインにテキストzzle挿入します。

z_lst() {                                                                      
  emulate -L zsh
  setopt extendedglob
  local lastfile
  # you could even implement your whole lst function here instead
  lastfile=$(lst)
  LBUFFER+=" ${lastfile// /\ }" # this should print the spaces like '\ '.
}                                                                               
zle -N z_lst && bindkey "^z" z_lst

これをあなたの適切な場所に追加してください.zsh

于 2013-01-24T15:59:35.023 に答える
1

バッククォートを使用しないでください常に適切に引用する必要があります。近道はありません。printf %qリモートで移植可能な唯一の代替手段です(Zsh${(q)var}も同様です)が、これらは問題には適していません。正しい(唯一の)答えは、引用することです。

編集:インタラクティブなものにはzshを使い続ける必要があるかもしれません。私はそのシェルの専門家ではありませんが、たとえば、特別な展開を使用しないと、デフォルト モードでは単語分割やグロビングを実行しないことを知っています。

$ zsh -c 'x="foo *"; echo $(printf "<%s> " $x)' # two passes of unquoted expansion
<foo *>
$ zsh -c 'emulate sh; x="foo *"; echo $(printf "<%s> " $x)'
<foo> <bltins> <builtins.mm> <COMPATIBILITY> <data> ...

これは、あなたが望むものの大きな勝利です (そして、zsh が他のすべてのスクリプトと完全に互換性を持たないようにする大きな要因の 1 つです)。他のシェルはこれを行うことができません。

于 2013-01-24T10:12:16.197 に答える