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がそれを実行。
- 「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 件のコメント:
コメントを投稿