43

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

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

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

4

8 に答える 8

89

一連のコマンドを連鎖させるには、次のことを試してください。

alias x='command1;command2;command3;'

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

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

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

また、パスワードをインタラクティブに入力したり、そのような他のプログラムとやり取りしたりする場合は、expectを確認してください。(http://expect.nist.gov/

于 2010-01-25T21:12:57.713 に答える
20

あなたは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マシンに簡単に移植できます。

于 2010-01-25T21:18:55.687 に答える
9

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

あなたの.bashrcで

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

次に、コマンドラインで次の操作を実行できます。

perform_my_command my_parameter my_other_parameter "my quoted parameter"

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

詳細な知識については、 Advanced BashScriptingGuideを参照することをお勧めします。

于 2010-01-25T21:29:47.587 に答える
8

エイリアスには、次を使用できます。

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

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

alias sequence='command1 -args && command2 -args'
于 2010-01-25T21:15:03.403 に答える
6

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

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

function myfunc {
   ( cd /tmp; command )
}

次に、コマンドプロンプトから

$ myfunc

2番目の質問では、コマンドを/ etc / sudoersに追加するだけです(自分が何をしているかを完全に確信している場合)

myuser           ALL = NOPASSWD: \
                    /bin/mycommand 
于 2010-01-25T21:39:38.227 に答える
5

1つのエイリアスで複数のコマンドを使用する場合は、論理演算子の1つを使用してそれらを組み合わせることができます。これは、ディレクトリに切り替えてlsを実行するためのものです

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

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

sudoのことに関しては、それが必要な場合(私はそれが良い考えではないと思いますが)、正しい方法は、/etc/sudoersファイルを変更して必要なものを取得することです。

于 2010-01-25T21:17:17.083 に答える
3

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

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

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

init-my-workspace.shたとえば、呼び出しているスクリプトがある、. init-my-workspace.shまたはsource init-my-workspace.shその目的が一連の環境変数(JAVA_HOME、PYTHON_PATHなど)を設定またはエクスポートすることであるとします。そこに関数が含まれている場合も、同じシェルインスタンスを使用した最新のmy_alias関数宣言が優先されるため、運が悪いことになります。

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

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

于 2015-10-03T20:45:42.680 に答える
1

シェル関数を作成することもできます。ここでの「cd」と「ls」の組み合わせの例

于 2014-07-08T22:02:49.080 に答える