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