Ubuntu 20.10.4 で複雑なエイリアスを作成する方法 (Ember を起動し、Rails を起動し、ディレクトリを変更する)

Ubuntu 20.10.4 で複雑なエイリアスを作成する方法 (Ember を起動し、Rails を起動し、ディレクトリを変更する)

Rails/Ember アプリを起動するためにエイリアスを使用し、新しいターミナル タブを開いて Ember ディレクトリに cd したいと思います。Ubuntu 20.10.4 とデフォルトのターミナルを使用しています。これまでのところ、次のようになっています。

alias myproject='cd ~/code/myproject-rails && rails s & cd ~/code/myproject-ember && ember s & gnome-terminal --tab --active && cd ~/code/myproject-ember'

これは部分的に機能しています。 と は両方ともrails s機能ember sし、ブラウザでアプリを開くことができます。新しいタブも開きますが、ホームディレクトリにあります。マニュアルページでは、--active「最後に指定したタブをそのウィンドウ内でアクティブなタブとして設定する」必要がありますが、cd(このタブでは) 実行されません。

何が間違っているのでしょうか?gnome-terminal --tab -e "cd ~/code/myproject-ember"代わりに使用するとエラーメッセージが表示されますそのようなファイル、又はディレクトリはありません

答え1

読んでくださいBash では、いつエイリアスを作成し、いつスクリプトを作成し、いつ関数を記述すればよいのでしょうか?

エイリアスは純粋にテキストによる置き換えです。エイリアスによって大量のコードが挿入されるため、関数にすればより簡潔になりますmyproject。これは副次的な「問題」です。必要に応じてエイリアスを使い続けることもできます。

主な問題は、cd ~/code/myproject-ember新しく開いたタブで作業することを期待していることです。エイリアスmyproject

… gnome-terminal --tab --active && cd ~/code/myproject-ember

このコードが実行されると、実行されたという事実は、次のコマンド( )をコマンドラインにgnome-terminal挿入しない。cd ~/code/myproject-emberそこには.cdは、この特定のプロセスが正常に終了した後に現在のシェルで実行されますgnome-terminal。スニペット全体は次のようになります。

… true && cd …

cdコマンド全体を実行するシェル以外でこれを実行する理由はありません。

次の理由により、この試みはgnome-terminal --tab -e "cd ~/code/myproject-ember"失敗しました:

  • ~展開されることはありません。エイリアスを定義するときにチルダをシングルクォートで囲むのは理解しています。エイリアス展開後は二重引用符次に、gnome-terminal文字列 を受け取りcd ~/code/myproject-ember、それを単語に分割し (チルダを展開せずに)、結果のコマンドを実行しようとしますが、シェル内では実行しません (シェル内ではチルダが最終的に展開される可能性があります)。
  • cdこの方法で実行しても意味がありません。cd …シェルで実行されません。別個のcd実行可能ファイル、OS にそれがある場合とない場合があります。たとえそれがあってチルダが展開されていたとしても、その無意味な仕事 (自身のディレクトリを変更する) をgnome-terminal実行して終了しますcd。このタブではそれ以上何もできません。

gnome-terminalあるディレクトリで対話型シェルを起動する正しい方法はここ:

gnome-terminal --working-directory=/path/to/dir

前と同様に、の後に を取得した場合はgnome-terminal展開されません。と を使用し、現在のシェルによって展開されるようにしてください。エイリアスを使用する場合は、次のようになります。~--working-directory=$HOME

alias myproject='cd ~/code/myproject-rails && rails s & cd ~/code/myproject-ember && ember s & gnome-terminal --tab --active "--working-directory=$HOME/code/myproject-ember"'

この場合、$HOME各エイリアスの展開後に展開されます。

先ほど言ったように、IMO では関数の方がエレガントだと思います:

unalias myproject
myproject () {
   cd ~/code/myproject-rails && rails s &
   cd ~/code/myproject-ember && ember s &
   gnome-terminal --tab --active "--working-directory=$HOME/code/myproject-ember"
}

注意してくださいrails、そしてember仕事になります古いシェル。それが何なのかは分かりませんが多分新しいシェルでジョブとして実行したいとします。これは可能ですが、ここでは詳しく説明しません。(必要なのに解決策が見つからない場合は、別の質問をしてください。)

関連情報