Bashでエイリアスを設定する方法は知っていますが、一連のコマンドのエイリアスを設定する方法はありますか?
つまり、あるコマンドを特定のディレクトリに変更してから、別のコマンドを実行したいとします。
さらに、「Sudo mycommand」を実行してからパスワードを入力するコマンドをセットアップする方法はありますか? MS-DOS時代には、.batファイルを探していましたが、Linux(またはこの場合はMac OSX)に相当するものがわかりません。
あなたは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マシンに簡単に移植できる慣れた個人用スクリプトの束ができたら、それが一番です。
コマンドのシーケンスをチェーンするには、これを試してください:
alias x='command1;command2;command3;'
または、これを行うことができます:
alias x='command1 && command2 && command3'
&&は、前のコマンドが成功を返した場合にのみ後続のコマンドを実行します。
また、パスワードを対話形式で入力する場合、またはそのような他のプログラムとインターフェイスする場合は、expectをチェックしてください。 ( http://expect.nist.gov/ )
エイリアスよりもこれらの種類の機能を定義する方がおそらく簡単で、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 をご覧ください。
ロジックがより複雑になる場合、またはパラメーターを追加する必要がある場合(bashはエイリアスパラメーターをサポートしますが)、おそらく最善策はエイリアスではなくシェル関数です。
この関数は、.profileまたは.bashrcで定義できます。サブシェルは、作業ディレクトリの変更を回避することです。
function myfunc {
( cd /tmp; command )
}
その後、コマンドプロンプトから
$ myfunc
2番目の質問では、コマンドを/ etc/sudoersに追加するだけです(実行内容が完全にわかっている場合)
myuser ALL = NOPASSWD: \
/bin/mycommand
エイリアスには、これを使用できます:
alias sequence='command1 -args; command2 -args;'
または、最初のコマンドが成功した場合にのみ2番目のコマンドを実行する必要がある場合:
alias sequence='command1 -args && command2 -args'
単一のエイリアスで複数のコマンドを使用する場合、論理演算子のいずれかを使用してそれらを結合できます。ディレクトリに切り替えてlsを実行するものを次に示します
alias x="cd /tmp && ls -al"
別のオプションは、シェル関数を使用することです。これらはsh/zsh/bashコマンドです。他のシェルが機能するかどうかを確認するのに十分な知識がありません。
須藤のことに関しては、もしあなたがそれを望むなら(それは良い考えだとは思いませんが)、行くべき正しい方法は/etc/sudoers
ファイルを変更してあなたが欲しいものを手に入れることです。
以下のように、エイリアス自体に関数が続く関数宣言を埋め込むことができます。
_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
_)に配置すると、名前の衝突を簡単に見つけることができることに注意してください。
シェル関数を作成することもできます。 「cd」と「ls」コンボの例 here