2016-03-12

zsh: グロッビング・パターンを含むパラメータを持つコマンドを「eval」で実行する

zsh: グロッビング・パターンが含まれたパラメータの有るコマンドを「eval」で実行するには  ««« 日本語
zsh: To execute "eval" on a command with globbing pattern. ««« English

はじめに



zshの関数に配列をパラメータとして渡す方法をトライしたが、失敗した。次善の策として「eval」に興味を持ったので調べてみた。初めには、参考資料1のp298に示されている「パラメータ展開フラグ;: ${(e)cmd}」を触ってみたが上手くいかなかった。


Google 検索で参考資料2を拝見すると,凄い記述、Figure  2、に衝突した。「${=cmd}」という簡潔で「eval」を体験できたのです。

Figure 1.

  • 参考資料2: zshとbashでは変数の単語の分割ルールが違う。http://qiita.com/mollifier/items/7fdbf15765ccf37f4881
    • zshとbashでは変数の単語の分割ルールが違う
      • zshでbashと同じようにスペースで区切る → 方法2: % ${=Cmd}

常用している参考資料3のPDFで「${=cmd}」を検索すると、如何にもな「${~cmd}」があった,Figure 2,ので試行錯誤した。

Figure 2.


 何はともかく試行錯誤したら上手くできたので、具体例をご紹介します。


結果



テストディレクトリには3つのファイル:aaa, bb, ccbaa:があります。
% ls
aaa    bb    ccbaa

次のコマンドを投入すると;
% cmd="ls -dF"
% prm="*a*"  
% ${=cmd} ${~prm}
aaa    ccbaa


確かに、目的が実行できました;



検討


結果で使った$cmdでグロッビング・パターン(*a*)を入れた場合を示します;
% cmd="ls -dF *a*"
% ${=cmd}
ls: *a*: No such file or directory

  • グロッビング・パターン(*a*)が解釈されずにファイル「*a*」としてパラメータに追加されたようです。


ところが、この$cmdにevalを作用させると、上手くいきます。
% eval $cmd
aaa    ccba

しかし、zsh製作者さん達が${~val}を製作した以上、evalのzsh版を探しました;
% ${=${~cmd}}
aaa    ccba
  • 最初に、${~cmd}でグロッビング・パターン(*a*)が解釈し、
  • ${=...}で、 全体を分割してshellに渡して、
  • Shellがそれを実行。
要するに、,zsh製作者さん達の真意は下記だったのでしょうか;
  • 「eval $cmd」=「${=${~cmd}}」
    • 此処まで来ると、evalの方がシンプルか。
    • 私が製作者なら、 「${=~cmd}」を許すかな。


参照資料

  • Reference 1: From Bash to Z Shell,  Oliver Kiddle et. al., Apress, ISBN-13:978-1-59059-379-9.
    • p298, ${(e)cmd}: Perform shell expansions on the value.
      • cmd="ls" works well! but unfortunately cmd="ls -l" not work.
  • Reference 2: "The variable splitting rules to words" differs between zsh and bash. 
    • http://qiita.com/mollifier/items/7fdbf15765ccf37f4881
      • To get same result of "Word splitting by space" in bash, a elegant way in zsh is :  % ${=cmd}.
  • Reference 3: "Zsh Referrence Card.pdf"
    • http://www.bash2zsh.com/zsh_refcard/refcard.pdf
      • Search "${=" in pdf.


この記事の履歴
  • 開始 2016-03-12(土) 01:33
  • 追加 2016-03-13(日) 23:21 検討
  • 追加 2016-03-14(月) 15:17 検討: ${=${~cmd}}

0 件のコメント:

コメントを投稿

注目の投稿

Terminalでの、なんちゃってViモドキ

近頃、ようやくKarabiner-Elementsに慣れてきたので、 Terminalで動作する「擬似Vi-Mode」を作って見たので、ご紹介します。 『概要』 「擬似Vi-Mode」の所以は、方向キー「←↓↑→」を通常の「hjkl」ではなくて「jkil」としました。これ...