エイリアスは位置パラメータを使用できますか? [コピー]

エイリアスは位置パラメータを使用できますか? [コピー]

私は次のような行を持っています.bashrc

#!/usr/bin/env bash
alias see='nano --view $1'

ただし、shellcheck優先順位の高い警告が生成されます。

Aliasは位置パラメータを使用できず、代わりに機能を使用します。

一つを除いて合理的です。素晴らしい作品!どうなりますか?

答え1

いいえ、まだあります。働く$1これは通常空であり、[1]参照されていないためです。結果コマンドsee foosee foo

しかし、次のように引用すると、次のようになります。

alias see='nano --view "$1"'

それはなりますsee <empty> foo、あなたは新しいバッファを除いfoonano


[1] $1次に展開シェルの最初の位置引数の値が何であれ- インタラクティブシェルから通常何もありません(対話型シェルは通常、位置引数で呼び出されないためです)。ただし、任意の値に設定されるのを防ぐことはありません(たとえば、次のように)。set内蔵ケース/ help set) -たとえば、次set -- foo bar; see bazのようにfoo開きますbaz(コメントから自由にコピーしました。@スチールドライバこれは重要なメモだからです。 )

そうしないでください。信じる常に空です。


次のことを試すこともできます。

$ alias e='echo @$1@'
$ e foo  <-- would become: echo @$1@ foo
@@ foo
|  |
|  +--- foo is next string
+------ $1 is empty

フード見ると言えば十分それはまるで:

execve("/bin/nano", ["nano", "--view", "foo"], 0xabc...)

引用されたバージョンの場合:

execve("/bin/nano", ["nano", "--view", "", "foo"], 0xabc...)

主な機能からnano

int main(int argc, char *argv[])

argc、(パラメータ数)はそれぞれ3と4になり、argv(パラメータベクトル/配列)は角括弧内の文字列になります。


あなたはそれを使用することができます:

alias see='nano --view'

次に、次の方法で発行します。

$ see foo

foo$1(実際ではありませんが、相対的$1に言えば)コマンドは次に展開されます。

nano --view foo

ナノを次に制限する必要がある場合オープンのみ可能$1、(最初のパラメータ)、次の理由で関数が必要です。

see foo bar

に拡張される予定です。nano --view foo bar

その後、次のようなものを使用できます。

see() {
    nano --view "$1"
}

それからあなたはそうでしょう捨てる上記のパラメータ$1execve呼び出し時には常に次のようになります。

execve("/bin/nano", ["nano", "--view", "filename"], 0xabc...)

filenameどこにありますか?$1ナノはbash見ることができず、$1値だけを見ることができます。 Bashはこの問題を処理します。


シェル関数を使用する場合、パラメータは位置パラメータ$1、、、、、…と$2$3機能これらのアイテムにアクセスできます。エイリアスは関数と見なされないため、これらのパラメーターにアクセスできないか、パラメーターが存在しません。

努力する:

alias p1='echo "$# $1 END"'
p2() { echo "$# $1 END"; }

結果:

$ p1 a b c
0  END a b c

$ p2 a b c
3 a END


一般的に、Bashマニュアルには次のように記載されています。

ほとんどすべての目的で、シェル関数はエイリアスより優れています。

そして

cshのように、代替テキストにパラメータを使用するメカニズムはありません。パラメータが必要な場合は、シェル関数を使用する必要があります(シェル関数の表示)。


shellcheckそれを書くには、SC2142のWikiを見る

答え2

ニックネーム欲しくない引数を受け入れ、そのままコピーされます。それら〜らしい(時々)動作します(やや)。しかしそれは真実ではない。

シェル関数を使用してください。

関連情報