ファイルにエイリアスを作成しようとしてbashrc
問題が発生しました。grep
サーバーの特定のIPアドレスにアクセスするコマンドのアクセスログが必要です。私の現在の項目は次のとおりです。
alias ip_usage='sudo grep "$1" /srv/logs/httpd/chris-server.com/access.log'
私のシェルの使い方は次のとおりです
ip_usage 192.168.0.0
ただし、これによりアクセスログのすべての履歴が再表示されます。
参照使用法を逆に試しましたが、パフォーマンスは同じです。
alias ip_usage="sudo grep '$1' /srv/logs/httpd/chris-server.com/access.log"
ランニング:
sudo grep '192.168.0.0' /srv/logs/httpd/chris-server.com/access.log
必要なレコードを再インポートするので、私の引用符と渡された値が含まれます。
答え1
引用された最初のバージョンは正しいです。とは別にエイリアスは望むことはできません。次の機能が必要です。
ip_usage() { sudo grep "$1" /srv/logs/httpd/chris-server.com/access.log; }
文書
からman bash
:
エイリアスを使用すると、単純なコマンドの最初の単語として使用するときに単語を文字列に置き換えることができます。
つまり、エイリアスは文字列置換を実行します。パラメーター操作をサポートしていません。したがって、$1
エイリアスを介して最初のパラメータを参照することはサポートされていません。
また、以下からman bash
:
シェル関数(上記のSHELL GRAMMARで説明されているように定義されています)は、後で実行するための一連のコマンドを格納します。シェル関数の名前を単純なコマンド名として使用すると、その関数名に関連付けられたコマンドのリストが実行されます。関数は現在のシェルのコンテキストで実行されます。関数を解釈するための新しいプロセスは作成されません(シェルスクリプトの実行とは対照的です)。関数が実行されると、関数のパラメーターは実行中に位置パラメーターになります。変更を反映するように特別なパラメータ#を更新します。特殊パラメータ0は変更されません。関数が実行されると、FUNCNAME変数の最初の要素が関数名に設定されます。
つまり、bash関数は位置引数をサポートします。
ナレーター:最後に$1のエイリアスが機能しているように見えるのはなぜですか?
エイリアスを定義しましょう。
$ alias e='echo $1'
それでは、シェルの位置パラメータを消去してエイリアスを実行してみましょう。
$ set --
$ e a b c
a b c
それは私たちが望むように正確に行われました。
しかし注意すべき点は罠があるということです。シェルの最初の位置引数を設定しましょう。
$ set -- First
$ echo "$1"
First
それでは、コマンドを再実行してみましょう。
$ e a b c
First a b c
$1
ここで、エイリアスは、エイリアスの最初のパラメータではなく、最初のシェルの最初のパラメータを参照することは明らかです。