zsh関数の$ *変数が予期しない結果を引き起こす

zsh関数の$ *変数が予期しない結果を引き起こす

私はこの関数を持っています(私の〜/ .zshrcで定義されています):

function graliases
{
    if [[ "$#*" -lt 1 ]]
    then
        echo "Usage: graliases <regex>"
    else
        echo "$*"
        grep -E '*"$*"*' ~/.dotfiles/zsh/aliases.zsh
    fi
}

~/.dotfiles/zsh/aliases.zshこの関数の役割は、引数として与えられた正規表現を使用してファイルを検索することです。正規表現の場合、2つのアスタリスクを追加して前に追加すると、検索結果は行の位置とは無関係になります。通常のgrepを使用すると、私のアイデアが機能します。

$ grep -E '*git rebase*' ~/.dotfiles/zsh/aliases.zsh
    alias gr='git rebase'
    alias gra='git rebase --abort'
    alias grc='git rebase --continue'
    alias gri='git rebase --interactive'
    alias grs='git rebase --skip'


$ grep -E '*ls -la*' ~/.dotfiles/zsh/aliases.zsh
alias lnew='ls -ld *(/om[1,3])'     # Show three newest directories. "om" orders by modification. "[1,3]" works like Python slice.
alias lsize='ls -l */**(Lk+100)'    # List all files larger than 100kb in this tree
alias lvd='ls -ld **/*(/^F)'        # recursively list any empty sub-directories
alias l='ls -lph'                   # size,show type,human readable
alias la='ls -lAph'                 # long list,show almost all,show type,human readable
alias lt='ls -lAtph'                # long list,sorted by date,show type,human readable

このgrepの例のインデントはもともとであり、エラーではありません。私の関数は基本的に同じことをする必要があります。 2つのアスタリスク(この場合git rebasels -la)の間にある項目をパラメータとして使用できます。

しかし、それは同じことをしないので、なぜそうなのかわかりません。

$ graliases git branch
git branch
alias lnew='ls -ld *(/om[1,3])'     # Show three newest directories. "om" orders by modification. "[1,3]" works like Python slice.
    alias findAllIPs="nmap -sP 192.168.1.* | grep -oE '192.168.1.[0-9]*'"
    alias findLocalIP="ifconfig | grep -oE 'inet 192.168.1.[0-9]*'"
    alias apls="apt list"
    alias gcR='git reset "HEAD^"'
    alias gdi='git status --porcelain --short --ignored | sed -n "s/^!! //p"'
    alias ggf="git ls-files | grep -i"
    alias gCl='git status | sed -n "s/^.*both [a-z]*ed: *//p"'
    alias gpc='git push --set-upstream origin "$(git-branch-current 2> /dev/null)"'
    alias gpp='git pull origin "$(git-branch-current 2> /dev/null)" 
          && git push origin "$(git-branch-current 2> /dev/null)"'
    alias gwig="git update-index --assume-unchanged"
    alias gwuig="git update-index --no-assume-unchanged"



% graliases ls -la
ls -la
alias lnew='ls -ld *(/om[1,3])'     # Show three newest directories. "om" orders by modification. "[1,3]" works like Python slice.
    alias findAllIPs="nmap -sP 192.168.1.* | grep -oE '192.168.1.[0-9]*'"
    alias findLocalIP="ifconfig | grep -oE 'inet 192.168.1.[0-9]*'"
    alias apls="apt list"
    alias gcR='git reset "HEAD^"'
    alias gdi='git status --porcelain --short --ignored | sed -n "s/^!! //p"'
    alias ggf="git ls-files | grep -i"
    alias gCl='git status | sed -n "s/^.*both [a-z]*ed: *//p"'
    alias gpc='git push --set-upstream origin "$(git-branch-current 2> /dev/null)"'
    alias gpp='git pull origin "$(git-branch-current 2> /dev/null)" 
          && git push origin "$(git-branch-current 2> /dev/null)"'
    alias gwig="git update-index --assume-unchanged"
    alias gwuig="git update-index --no-assume-unchanged"

~によると12は、$*このユースケースの正しい変数です。その行もecho "$*"予想される結果を印刷します。残念ながら、$*zshのマニュアルページで明確な説明が見つかりませんでした。

私の機能が正しく機能しないのはなぜですか?

答え1

パターンがgrep正しくないようです。コマンドラインの経験的規則は、単一引用符内のすべての内容が文字通り処理され、引用符がないか二重引用符内にある場合、シェルはその規則(グローバル化、分割、パラメータ拡張など)に従って対応する文字列を拡張することです。 。あなたの場合

grep -E '*"$*"*' ~/.dotfiles/zsh/aliases.zsh

grep文字通り文字列に渡されることを意味します*"$*"*。したがって、grepはパターンをアスタリスク、二重引用符、*0回以上繰り返すドル記号()、0回以上繰り返す二重引用符()として解釈します*。これはあなたが期待するものではありません。

$*これを変数(この場合は二重引用符)として扱おうとするので、前の一重引用符文字列を閉じて再度開きます。

grep -E '*'"$*"'*' ~/.dotfiles/zsh/aliases.zsh

しかし、私はこれらの星の理由をまったく理解していません(あなたは星を探したくないですか?)。それを単純化できるようです。

grep -E "$*" ~/.dotfiles/zsh/aliases.zsh

関連情報