find
「自動モード」(すべてのメッセージなし)で実行できるエイリアスの作成に問題がありますPermission denied
。私のbash技術が非常に悪く、この問題を解決する方法がわかりません。
これは私のエイリアスです~/.bashrc
。
alias find='function _find(){find / -name "$1" 2>&1 | grep -v "Permission denied"}'
source ~/.bashrc
したがって、実行するとsudo find "Exercism"
出力が表示されます。find: ‘Exercism’: No such file or directory
ただし、実行するとfind / -name "Exercism" 2>&1 | grep -v "Permission denied"
正しい結果が生成されます。
find
パラメータをエイリアス関数に正しく渡すのか、まったく渡すのかわかりません。
答え1
エイリアスは、解釈される前にシェルコード内の単語を別のテキストに置き換えると考えてください。
エイリアスは次find
のように定義されます。
alias find='function _find(){find / -name "$1" 2>&1 | grep -v "Permission denied"}'
入力したとおり
find
プロンプトで次に置き換えられます。
function _find(){find / -name "$1" 2>&1 | grep -v "Permission denied"}
シェルがある場合、zsh
このコードは本文が_find
イン関数を定義しますfind / -name "$1" 2>&1 | grep -v "Permission denied"
。を含む他のシェルでは、変数宣言の正しい構文ではないか(またはなど)、これは単純なコマンドとして扱われ、単純なコマンドをサポートしていない唯一のシェルであるため、構文エラーがbash
発生します。関数本体としてのコマンド。function f()
bash
yash
{find...
bash
yash
ここでは、別名ではなく関数を定義しようとしていますが、関数はコマンドとは異なるfind
APIを持っているので、私と同じ名前で呼び出す必要があります。
myfind() {
find / -name "$@" 2>&1 | grep -v "Permission denied"
}
とにかくエイリアスまたは関数は両方ともシェルの内部関数なので、から呼び出すことはできませんsudo
。sudo
呼び出すには、スクリプトなどの実際のコマンドを作成する必要があります。
#! /bin/sh -
find / -name "$@" 2>&1 | grep -v "Permission denied"
スクリプトを実行可能にし、sudo
ssecure_path
が定義されたディレクトリに保存する必要があります。
答え2
alias find='function _find() { find / -name "$1" 2>&1 | grep -v ": Permission denied$"; } ; _find'
あなたのエイリアスは関数を定義します。関数を定義したい呼ぶ。