私は次のような行を持っています.bashrc
:
#!/usr/bin/env bash
alias see='nano --view $1'
ただし、shellcheck
優先順位の高い警告が生成されます。
Aliasは位置パラメータを使用できず、代わりに機能を使用します。
一つを除いて合理的です。素晴らしい作品!どうなりますか?
答え1
いいえ、まだあります。働く$1
これは通常空であり、[1]参照されていないためです。結果コマンドsee foo
はsee foo
。
しかし、次のように引用すると、次のようになります。
alias see='nano --view "$1"'
それはなりますsee <empty> foo
、あなたは新しいバッファを除いfoo
てnano
。
[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"
}
それからあなたはそうでしょう捨てる上記のパラメータ$1
とexecve
呼び出し時には常に次のようになります。
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
ニックネーム欲しくない引数を受け入れ、そのままコピーされます。それら〜らしい(時々)動作します(やや)。しかしそれは真実ではない。
シェル関数を使用してください。