コマンドライン引数をシェルエイリアスに渡す方法は?


288

コマンドライン引数をエイリアスに渡すにはどうすればよいですか?ここにサンプルがあります:

エイリアスmkcd = 'mkdir $ 1; cd $ 1; '

ただし、この場合、$ xxは実行時ではなくエイリアスの作成時に変換されます。ただし、次のように(少しグーグルした後)シェル関数を使用して回避策を作成しました。

関数mkcd(){
  mkdir $ 1
  CD $ 1
}

CLパラメータを受け入れるエイリアスを作成する方法があるかどうかを知りたかっただけです。
ところで、私はデフォルトのシェルとして「bash」を使用しています。



2
O / Tですが、mkcd関数を実行する代わりに、次のように書くことができますmkdir mydirectoryname && cd $_
moala

回答:


174

方法を見つけました:エイリアスの代わりに関数を作成します。Cシェルにはエイリアスへの引数を実行するためのメカニズムがありますが、関数メカニズムはより柔軟で同じ機能を提供するため、bashおよびKornシェルにはありません。


ただし、.bashrcファイルにエイリアスを作成するときに関数は必要ありません。例##ユーザーエイリアスによってポート番号を取得するエイリアスを作成serve = "python -m SimpleHTTPServer $ 1" .bashrcファイルに変更を加えたら、必ず次のコマンドを入力してください。〜$ source .bashrcこのように使用できるはずです〜$ serve
8998

8
@ kaizer1v、CentOS7.3 bashバージョン4.2.46での私の観察は、あなたの提案が思ったように機能しないことです。二重引用符を使用しているので、$ 1は実際には空の文字列として評価され、エイリアスは実際にはエイリアスserve = "python -m SimpleHTTPServer"と同じです。このセットを試した場合-x; エイリアスserve = "python -m SimpleHTTPServer $ 1&"には、エラー/問題が表示されます。引数とエイリアスコマンドの両方が個別のコマンドとして実行されます。
PatS

279

他のシェルに投稿された内容を繰り返すために、Bashでは次の作業を行います。

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

以下を実行します:

blah one two

以下の出力を提供します:

First: one
Second: two

4
素晴らしいソリューション。bash初心者からのいくつかの質問:関数にはアンダースコア(またはまったく異なる)を付けた名前にする必要がありますか?関数を定義する際の末尾の "; _blah"の目的は何ですか?単一引用符の代わりに二重引用符を使用すると($ 1は正しく解釈されない)、$ 1を囲む引用符を必要としない処理を行っても機能しないのはなぜですか?アドバイスを事前にありがとう。私は実用的な解決策を持っていますが、なぜそれが機能するのかについてもっと理解したいです。
mynameispaulie 2014

4
@mynameispaulie関数には任意の名前を付けることができます。アンダースコアプレフィックスは、名前の競合(つまり、同じ名前の別の関数)を防ぐための一般的なトリックであるため、使用しました
Thomas Bratt

6
@mynameispaulie二重引用符を使用Bashする$1$2、関数に渡されたパラメーターを置換できます。一重引用符はBashにこれを行わないように指示します。
Thomas Bratt 2014年

5
このエイリアス/関数の組み合わせのコピー/貼り付けがよく見られますが、有用な目的を果たしていないようです。標準的なアプローチは、正しい名前で関数を一度定義し、エイリアスを持たないことです。
tripleee 2016

16
私はこれが好まれるかを確認するために失敗するfunction blah(){ echo "First: $1"; echo "Second: $2"; }
ルネ・Nyffenegger

57

kshではできませんが、cshではできます。

alias mkcd 'mkdir \!^; cd \!^1'

kshでは、関数はそのための方法です。しかし、本当にエイリアスを使用したい場合:

alias mkcd='_(){ mkdir $1; cd $1; }; _'

興味深い補足として、最近話題になっているリモートコード実行の脆弱性は、ほぼ同じことを行いますが、生のユーザー入力によって環境変数が設定されることです。 openwall.com/lists/oss-security/2014/09/24/11
Floegipoky

@Floegipoky-エイリアスであり、env varではないため、大幅に異なります。ShellShockの問題は、env varが設定されているときに実行されることです。env varの設定は安全な操作であると考えられています。上記のエイリアスが設定されている場合、スクリプトは実行されません。エイリアスが実行されている場合のみです。
Sanjaya R

おそらくそれはcsh、現代人が通常使用したくないものではないことを指摘しておくべきでしょう。関数を作成し、関数を実行して、その関数を間接的に実行するエイリアスは比較的一般的ですが、私が知る限り、適切な関数よりもメリットはありません。(とにかく、関数はその引数を適切に引用する必要があります。)反対投票。
tripleee 2016

17

bashのmanページを引用するには:

置換テキストで引数を使用するメカニズムはありません。引数が必要な場合は、シェル関数を使用する必要があります(以下の関数を参照)。

だからあなたはあなた自身の質問に答えたようです-エイリアスの代わりに関数を使用してください



5

関数を書き込めないことがわかりました ~/.cshrcファイル。ここでは引数を取るエイリアスで

たとえば、 'find'コマンドに渡される引数

alias fl "find . -name '\!:1'"     
Ex: >fl abc

ここで、abcは!:1として渡される引数です。


4
これは、デフォルトのシェルがbashであるOPには役立ちません。Sanjaya Rの回答では、4年前にcshエイリアスについて言及していました。
キーストンプソン

1
Sanjaya Rの回答では、!:1意味がわかりませんでした。私はそれが議論であることをここに見るためにスクロールダウンしなければなりませんでした。たとえOPシェルタイプではなかったとしても、良い答えはそれ以上の質問を残しません。
searchengine27 2017年

4

最も簡単な方法は、エイリアスではなく関数を使用することです。cliからいつでも関数を呼び出すことができます。bashでは、エイリアスと同じようにロードする関数name(){command}を追加するだけです。

function mkcd() { mkdir $1; cd $1 ;}

他のシェルについてはわからない



1

これはkshで機能します。

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

「-x」オプションは、エイリアスを「エクスポート」します-エイリアスはサブシェルに表示されます。

また、スクリプトで定義されたエイリアスはそのスクリプトでは表示されないことに注意してください(エイリアスは、行が解釈されるときではなく、スクリプトが読み込まれるときに展開されるためです)。これは、同じシェルで別のスクリプトファイルを実行することで解決できます(ドットを使用)。



-2

Pythonを使用した簡単な関数の例を次に示します。〜/ .bashrcを挿入でき
ます。最初の左中括弧
の後にスペースが必要です。変数置換を取得するには、pythonコマンドを二重引用符で囲む必要があります。
末尾のセミコロンを忘れないでください

function count(){python -c "for num in xrange($ 1):print num";}

$ count 6
0
1
2
3
4
5
$

-5

空のエイリアスはその引数を実行します:

alias DEBUG=

12
SO(Stack Overflow)は初めてです。あなたの答えの投票に落胆しないでください。OP(元のポスター)が回答するように求めた質問には実際には回答しないため、投票は拒否されました。彼らの中にぶら下がって、挑戦し続けてください。また、答えるときは、答えがどのように機能するかを示す簡単な例を含めて、出力を表示してください。これは、あなたの答えがどのように機能するかを他の人が見るのに役立ちます。
PatS 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.