bashでコマンドを定義することは可能ですか?


25

たとえば、以下を設定できますか?

gb = cd /media/Dan/evolution

...それでgb、bashで実行するたびcdに、その特定のディレクトリに移動できますか?

オンラインで何かを見つけました:aliasコマンド。ただし、上記の作業を実行できないようです。

それを行うことは可能ですか?どうやって?


10
alias gb='cd /media/Dan/evolution'
ナイカキン14

4
@Zen、問題が解決する場合は回答を受け入れてください。これは、問題を解決するのを手伝ってくれたユーザーに感謝するというジェスチャーです:)
Ramesh 14

2
注:これはbashについてです:Linuxはカーネルです。Linuxは、多くの場合、誤って、オペレーティングシステム全体を指すために使用されます。これにより混乱が生じる可能性があります。たとえば、「Linuxでこんなことはできますか?」という質問は、あるコンピューターでできるならそうです。Linuxカーネルを使用して、好きなオペレーティングシステムを実装できるからです。したがって、Ubuntu Gnu + Linux +おそらくX11を使用しているのかを知る必要があります(デスクトップの場合、つまりディスプレイのないサーバーではない場合)。
ctrl-alt-delor 14

@richard良い点ですが、技術的にはこれがposix苦情なので、それだけではありませんbash

1
@richard確かに、それが問題です。人々はAndroidやそのようなフレーバーを多かれ少なかれ意味しないので、それは機能します。私はそれが良いことだとは言っていませんが、それはそれが何であるかです。あなたのLinuxステートメントについてコメントしていたので、私の紹介は暗黙的でした。主題は混乱を招く用語だったので、私は自分自身を明確にしていました。(私はあなたの最後のコメントを誤解したかもしれません)
キーヤー14

回答:


50

入力するだけ:

alias gb='cd /media/Dan/evolution'

この設定を永続的にするために(再起動または別のコンソールを開いた後に固執するように)この行を〜/ .bashrcファイルに追加します(bashをデフォルトのシェルとして使用すると仮定します)


さらに便利にするために、エイリアス用に〜/ .bash_aliasesと言う専用のエイリアスファイルを作成し、次のように〜/ .bashrcファイル内から呼び出すことができます:[-e〜/ .bash_aliases] &&。〜/ .bash_aliasesこの方法では、〜/ .bashrcファイルを他のもので「汚染」することはありません。
GeertVc 14

39

エイリアシングの代替

gb() { cd /media/Dan/evolution; }

これは、引数をとらないシェル関数gbを定義し、cd / media / Dan / evolutionを実行します。他の提案と同様に、これは〜/ .bashrcに追加できます


aliasコマンドが定義されたエイリアスを表示するという不利な点があると、そのような関数を定義するafaikは「予期しない動作」を引き起こす可能性があります。私は完全性のためにあなたに投票します:)
vfbsilva 14

7
あんまり。次のように入力するだけです:-f gbを宣言して、それが何をするのかを確認します
Paul Calabro 14

11
また、このオプションを使用すると、関数定義内にカスタムロジックを追加して引数を受け取り、必要な処理を実行できるという点で、より柔軟になります。エイリアスでは、引数の受け渡しと事前定義されたアクションの実行のみが許可されます。
ポールカラブロ14

5
@PaulCalabroさらに良いことに、type gbそれがエイリアスまたは関数であれば機能します。
スパルホーク14

POSIXLY:{ echo 'true() { : ; }' >./script ; . ./script ; command -V true ; command -V /usr/bin/true ; }- true is a shell function\n/usr/bin/true is /usr/bin/true- \n文字が出力にリテラル改行ました。
mikeserv

11

それは可能でありalias、あなたが探しているコマンドです。たとえばalias ll="ls -l"、bash llではの代わりに入力できますls -l。エイリアスを設定するときにスペースが使用されないことに注意してください。man alias同様に便利です。


-3

または、目的のコマンドを呼び出すCプログラムを作成して、/ usr / binに保存することもできます。

#include <stdio.h>
#include <string.h>

int main () {
    char command[50]; //notice you can change this to fit your needs
    int return_val;

    strcpy( command, "echo \"cd /media/Dan/evolution\" | bash -i" );
    return_val = system(command); 

   //this is equivalent to entering the command in a new bash, 
   //which will return and exit

    return return_val;
}

コンパイルするには、ソースが保存されているディレクトリに移動して(bashで)実行します(sudoが必要な場合があります)。

 gcc ./gb.c -o /usr/bin/gb

ここでさらに調査した結果system()bashに組み込まれたコマンドでは単にコマンドを投げても機能しないことがわかりました。そのため、対話型bashのインスタンスを作成し、コマンドをエコーする必要があります。複雑すぎるだけで、おそらく役に立たないでしょう。たとえば、シェルスクリプトの呼び出しを(のsome_script代わりにsh ~/radgeRayden/Scripts/some_script)短くしたい場合を除きます。

system()関数のリファレンス


2
実際にこれを試しましたか?機能しません。
デニス14

1
同じ理由でsh -c "cd /media/Dan/evolution"機能しません。ヒント:サブシェル
デジタルトラウマ14

5
cd/ subshel​​lの問題は別として、Cプログラムでシェルコマンドをラップする利点は、シェルスクリプトにそのコマンドを簡単に(またはより簡単に)配置できることですか?
デジタル外傷14

1
これの専門家ではありませんが、このようなもの(できればもっと便利なもの)を/ usr / local / binに入れるべきではありませんか?
ジョー14

2
このCOULDが機能しても、1人のユーザーに固有であるため、/ usr / local / binに入れないでください。
ヨハン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.