web-dev-qa-db-ja.com

複数のコマンドのシーケンスとしてbashエイリアスを定義するにはどうすればよいですか?

Bashでエイリアスを設定する方法は知っていますが、一連のコマンドのエイリアスを設定する方法はありますか?

つまり、あるコマンドを特定のディレクトリに変更してから、別のコマンドを実行したいとします。

さらに、「Sudo mycommand」を実行してからパスワードを入力するコマンドをセットアップする方法はありますか? MS-DOS時代には、.batファイルを探していましたが、Linux(またはこの場合はMac OSX)に相当するものがわかりません。

31
stormist

あなたはBATファイルに言及しているので、おそらくあなたが望むのはシェルスクリプトを書くことです。その場合は、次のようなファイルに1行ずつ必要なコマンドを入力します。

command1
command2

そして、bashにファイルの実行を依頼します。

bash myscript.sh

「bash」と入力せずにスクリプトを直接起動できるようにするには、次の行をファイルの最初の行として追加します。

#! /bin/bash
command1
command2

次に、ファイルを実行可能としてマークします。

chmod 755 myscript.sh

これで、他の実行可能ファイルと同じように実行できます。

./myscript.sh

UNIXはファイル拡張子を実際に気にしないことに注意してください。必要に応じて、ファイルに「.sh」拡張子を付けずに「myscript」という名前を付けるだけです。重要なのは特別な最初の行です。たとえば、bashではなくPerlプログラミング言語でスクリプトを作成する場合、最初の行は次のようになります。

#! /usr/bin/Perl

その最初の行は、スクリプトを実行するために呼び出すインタープリターをシェルに伝えます。

また、$ PATH環境変数にリストされているディレクトリのいずれかにスクリプトをコピーした場合、ファイル名を入力するだけでどこからでも呼び出すことができます。

myscript.sh

タブ補完も機能します。個人用スクリプトを簡単にインストールできるように、通常$ PATHに〜/ binディレクトリを含めるのはこのためです。そして何よりも、個人用の〜/ binディレクトリをコピーすることで、新しいUNIXマシンに簡単に移植できる慣れた個人用スクリプトの束ができたら、それが一番です。

15
slebetman

コマンドのシーケンスをチェーンするには、これを試してください:

alias x='command1;command2;command3;'

または、これを行うことができます:

alias x='command1 && command2 && command3'

&&は、前のコマンドが成功を返した場合にのみ後続のコマンドを実行します。

また、パスワードを対話形式で入力する場合、またはそのような他のプログラムとインターフェイスする場合は、expectをチェックしてください。 ( http://expect.nist.gov/

70
Larry Shatzer

エイリアスよりもこれらの種類の機能を定義する方がおそらく簡単で、1つまたは2つ以上のコマンドを実行する場合は、より読みやすくなります。

.bashrcで

perform_my_command() {
    pushd /some_dir
    my_command "$@"
    popd
}

その後、コマンドラインで簡単に実行できます:

perform_my_command my_parameter my_other_parameter "my quoted parameter"

関数で好きなことをしたり、他の関数を呼び出したりすることができます。

詳細な知識については、 Advanced Bash Scripting Guide をご覧ください。

8
wich

ロジックがより複雑になる場合、またはパラメーターを追加する必要がある場合(bashはエイリアスパラメーターをサポートしますが)、おそらく最善策はエイリアスではなくシェル関数です。

この関数は、.profileまたは.bashrcで定義できます。サブシェルは、作業ディレクトリの変更を回避することです。

function myfunc {
   ( cd /tmp; command )
}

その後、コマンドプロンプトから

$ myfunc

2番目の質問では、コマンドを/ etc/sudoersに追加するだけです(実行内容が完全にわかっている場合)

myuser           ALL = NOPASSWD: \
                    /bin/mycommand 
6

エイリアスには、これを使用できます:

alias sequence='command1 -args; command2 -args;'

または、最初のコマンドが成功した場合にのみ2番目のコマンドを実行する必要がある場合:

alias sequence='command1 -args && command2 -args'
6
gregseth

単一のエイリアスで複数のコマンドを使用する場合、論理演算子のいずれかを使用してそれらを結合できます。ディレクトリに切り替えてlsを実行するものを次に示します

      alias x="cd /tmp && ls -al"

別のオプションは、シェル関数を使用することです。これらはsh/zsh/bashコマンドです。他のシェルが機能するかどうかを確認するのに十分な知識がありません。

須藤のことに関しては、もしあなたがそれを望むなら(それは良い考えだとは思いませんが)、行くべき正しい方法は/etc/sudoersファイルを変更してあなたが欲しいものを手に入れることです。

3
Noufal Ibrahim

以下のように、エイリアス自体に関数が続く関数宣言を埋め込むことができます。

_alias my_alias='f() { do_stuff_with "$@" (arguments)" ...; }; f'
_

関数を単独で宣言するよりもこのアプローチの利点は、ソースとなる(または_._を使用する)他のスクリプトによって関数がオーバーライドされないという安心感を得ることができることです。同じ名前で独自のヘルパーを使用します。

たとえば、環境変数(Java_HOME、PYTHON_PATHなど)を設定またはエクスポートすることを目的とする_init-my-workspace.sh_または_. init-my-workspace.sh_のように呼び出すスクリプト_source init-my-workspace.sh_があるとします。 。そこに関数_my_alias_が含まれている場合も、同じシェルインスタンスでのlatest関数宣言が優先されるため、運が悪いです。

反対に、エイリアスには個別の名前空間があり、名前が衝突した場合でも、最初に検索されます。したがって、インタラクティブな使用に関連するカスタマイズでは、エイリアスのみを使用する必要があります。

最後に、すべてのエイリアスを同じ場所(たとえば、_~/.bash_aliases_)に配置すると、名前の衝突を簡単に見つけることができることに注意してください。

2
eold

シェル関数を作成することもできます。 「cd」と「ls」コンボの例 here

1
B.Kocis