
簡単な質問は次のとおりです。特定のディレクトリで対話型bashを起動する必要があり、bashを起動するコマンドを作成できますが、システムを変更することはできません。現在私のニーズに最適なコマンドは次のとおりです。
bash -c 'cd some-directory; bash'
つまり、bashを呼び出してcd
bash内で使用し、その中にbashの子インスタンスを作成して対話型bashを処理します。
私はこれが世界で最も衝撃的なbashの使用ではないことを知っていますが、私にとっては奇妙に見えます。私が探しているものを達成するより簡単な方法はありますか?
不要な文脈についてのみ:
これは、docker-composeを介してdockerインスタンスで(docker execを使用して)シェルを起動するためのツールの一部です。私はプロジェクトを表す約15のドッカーコンテナのうちの1つで自分自身を見つけることができます。そのうちのいくつかは私が望む「デフォルト」ディレクトリを持っていて、一部はそうではありません。このツールはギャップを解消し、あるプロジェクトから別のプロジェクトへのよりシームレスな移行体験を提供するように設計されています。
私は効果があると思いますが、含まないいくつかのことを試しました。
PWD='~/some/directory' bash
- ただ無視されました。bash -i -c "cd ~/some/directory
- インタラクティブにマークされたシェルを作成しますが、通常のインタラクティブシェルのように入力を待ちません。echo "cd ~/some/directory" | bash --rcfile -"
試してみる価値がある
私はいくつかが動作することを知っていますが、私の場合はそうではありません。
- 作業ディレクトリを変更してからコマンドを開始します。私はdockerにいるので、ホストの作業ディレクトリは重要ではありません。 bashが親シェルの現在の作業ディレクトリが何であるかをどのように知っているのか疑問に思います。
docker-compose
-w
実際には絶対パスを使用しますが、チルダの処理方法がわからない場合があります。cd ~/some/directory ; bash
- docker-compose には実際の実行ファイルが必要です。- コンテナのrcfileに入れるか、「ランチャー」スクリプトを作成します。ある程度動作しますが、外部で構成でき、各コンテナを編集したくありません。
それでは、私が無視している初期ディレクトリを設定する方法がありますか、それともそうしますか?私は、Gnomeの「ターミナルでフォルダを開く」のようなシェル統合が、bashに起動するフォルダを知らせるために何かをする必要があることを知っていますが、それがどのような魔法を使用しているのかわかりません。
答え1
現在、シェルを「exec」に変更することは少し改善です。
bash -c 'cd somedirectory && exec bash -i'
次のようなものを入れることができます
if [ -n "$STARTDIR" ] ; then
cd "$STARTDIR"
unset STARTDIR
fi
~/.bashrc で以下を使用します。
STARTDIR="/some/directory" bash
他のファイルに入れて使用することもできますbash --rcfile ~/changedir
端末でフォルダを開くプログラムは、シェルに操作を要求するのではなく、fork
端末にcdを要求したり、一連chdir /some/directory
のシステムコールを実行します。exec terminal