Bashスクリプトから現在のディレクトリを変更する


190

スクリプトから現在のディレクトリを変更することはできますか?

Bashでディレクトリナビゲーション用のユーティリティを作成したい。次のようなテストスクリプトを作成しました。

#!/bin/bash
cd /home/artemb

Bashシェルからスクリプトを実行しても、現在のディレクトリは変更されません。スクリプトから現在のシェルディレクトリを変更することはまったく可能ですか?


2
単なる拡張の提案です。の代わりにpushd(場合によっては>/dev/nullその出力を抑制するためにリダイレクトされる)を使用するとcd、後でで前のディレクトリに戻ることができますpopd
mklement0

回答:


173

スクリプトをシェル関数に変換する必要があります。

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

その理由は、各プロセスには独自の現在のディレクトリがあり、シェルからプログラムを実行すると、新しいプロセスで実行されるためです。標準の「cd」、「pushd」、「popd」はシェルインタープリターに組み込まれているため、シェルプロセスに影響を与えます。

プログラムをシェル関数にすることで、独自のインプロセスコマンドを追加し、ディレクトリの変更がシェルプロセスに反映されます。


2
あなたはtcshでこれをどのように行いますか?
joedborg 2011

4
+1。私が気づいたことの1つはファイル内にありました。それを呼び出す前に関数を定義する必要があります。それは私と同じくらい経験の浅い人を助けるかもしれません。
Bhushan 2013

関数の定義とエイリアスの作成の大きな違いは何ですか?
HelloGoodbye 2015年

1
このmyprog.shファイルを作成して.bashrcに追加したら、スクリプトをどのように実行しますか?別のシェルファイルから、または直接シェルから関数を呼び出す必要がありますか?どちらの方法でも機能しないようです...
Andrea Silvestri

1
@AndreaSilvestriログアウトしてから再度ログインするか、ソース.bashrcを使用します。.bashrcに追加しても、.bashrcが実行されるまでは何も起こりません。
Jon Strayer 2017年

213

スクリプトを開始すると、環境を継承するだけの新しいプロセスが作成されます。それが終わるとき、それは終わります。現在の環境はそのままです。

代わりに、次のようにスクリプトを開始できます。

. myscript.sh

.それは変更される場合がありますので、現在の環境でスクリプトを評価します


4
あなたが正しいから+1。彼がディレクトリ変更スクリプトを必要とするたびに、それをソースにしたいとは思いません。さらに、.sh拡張機能は完全にewwです。それらを使用しないでください。
lhunath 2009年

1
はい、通常はそのように使用しないことをお勧めします。ほとんどの場合、現在の環境が影響を受けないことをうれしく思います。しかし、適切な場所への変更など、いくつかのセットアップタスクを実行するスクリプトがあります。それらも。ところで .shはもちろん個人的なスタイルの問題です。システム全体にスクリプトをインストールしている間は、おそらくそれを使用しません。しかし、私は〜/ binでそれらを使用して何が何であるかを知る:)
Norbert Hartl

11
@lhunathなぜ.sh拡張子は完全にewwなのですか?
Carl Pritchett、2014


1
その記事の推論は私には偽物です。結果は事前に知られているようですが、その理由を見つけるのは簡単ではありませんでした。だから私は、それは個人的なスタイルの問題であり、他には何もないことを私は主張します。
Norbert Hartl 2015年

55

解読不能で複雑すぎるので、これは要求者がすべきことだと思います

  1. そのスクリプトを PATH
  2. スクリプトを次のように実行します . scriptname

.(ドット)が必ずスクリプトは、子シェルで実行されるのではないでしょう。


38

上記を組み合わせて、エイリアスを作成できます

alias your_cmd=". your_cmd"

先頭の「。」を書きたくない場合 スクリプトをシェル環境にソーシングするたびに、または単に覚えておきたくない場合は、スクリプトが正しく機能するためにこれを行う必要があります。


これは再起動後も持続しますか?
SDsolar 2017年

1
@SDsolar永続化するには、これを〜/ .bashrcファイルに追加する必要があります。私にとっては魅力のように機能します。
ラファウG.

〜/ .bash_aliasesに入れることができます
Champ

@Champ ~/.bash_aliasesは、Bashの起動時に常に提供されるわけではありません。
Mateusz Piotrowski

31

bashを使用している場合は、エイリアスを試すことができます。

.bashrcファイルに次の行を追加します。

alias p='cd /home/serdar/my_new_folder/path/'

コマンドラインで "p"と入力すると、ディレクトリが変更されます。


1
エイリアスの場合は+1。シェル機能は興味深いですが、OPはcdを使用した簡単なナビゲーションを要求しました。私は、ほとんどの人がソースコードのブランチをナビゲートするためにこのようなスクリプトを必要としていると思います。そのエイリアスには十分です
Brad Dre

19

bashスクリプトを実行すると、現在の環境またはその子の環境で動作し、親では動作しません。

目標がコマンドの実行である場合:goto.sh / home / test次に/ home / testでインタラクティブに作業する1つの方法は、スクリプト内でbashインタラクティブサブシェルを実行することです。

#!/bin/bash
cd $1
exec bash

このようにして、このシェルを終了(exitまたはCtrl + C)するまで/ home / testに入ります。


これで、実行中のシェルスクリプトの問題が修正されると思いましたが、代わりにシェルが起動し、必要なものが忘れられます。
vwvan

13

pushdは、現在のディレクトリは、ディレクトリスタックにプッシュされ、それが与えられたディレクトリに変更され、POPDスタックの一番上のディレクトリを取得し、それに続い変わります。

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

2
これは私の質問に答えます—このソリューションをS3 initスクリプトで積極的に展開すると、完全にうまく機能します。@sebに感謝します。
2014

5

単に行く

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

最後の行の横に次のコードを追加します。

alias yourcommand="cd /the_path_you_wish"

次に、エディターを終了します。

次に、次のように入力します。

source ~/.bashrc or source ~/.bash_profile on MAC.

今、あなたは使うことができます:あなたのコマンドをターミナルで



3

基本的にcd..、すべてのディレクトリから戻るために使用します。一度に戻る必要があるディレクトリの数を指定することで、より簡単にできると思いました。これは、aliasコマンドを使用する別のスクリプトファイルを使用して実装できます。例えば:

code.sh

#!/bin/sh
 _backfunc(){
 if [ "$1" -eq 1 ]; then
  cd ..
 elif [ "$1" -eq 2 ]; then
  cd ../..
 elif [ "$1" -eq 3 ]; then
  cd ../../..
 elif [ "$1" -eq 4 ]; then
  cd ../../../..
 elif ["$1" -eq 10]; then
  cd /home/arun/Documents/work
 fi
 }
alias back='_backfunc'   

source code.sh現在のシェルで使用した後、使用できます:

$back 2 

現在のディレクトリから2ステップ戻ります。詳細に説明ここます。また、コードを〜/ .bashrcに配置する方法についても説明されているため、新しいシェルを開くたびに、この新しいエイリアスコマンドが自動的に追加されます。さらにif conditions別の引数を追加してコードを変更することにより、特定のディレクトリに移動する新しいコマンドを追加できます。ここからgitからコードをプルすることもできます


素晴らしいソリューションなので、bashプロファイルを台無しにすることはありません:)
J4cK

0

このアプローチは私にとっては簡単です。

あなたが管理者である個人のiMacで、コマンドウィンドウを開いたときのデフォルトディレクトリ/ Users / jdoeの下にあるとします。これは、次のディレクトリに移動します:/Users/jdoe/Desktop/Mongo/db.3.2.1 /置き場。

これらは仕事をすることができるステップです:

  1. 私が入力したvi mongobin: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin最初の行として。
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

出来上がり!


0

山羊というユーティリティも作成しましたナビゲーションを簡単にするために使用できるという。

GitHubでソースコードを表示できます

以下のようv2.3.1 使用方法の概要次のようになります。

# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev

# Follow a link to change a directory:
cd h4xdir

# Follow a link (and don't stop there!):
cd h4xdir/awesome-project

# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...

# List all your links:
goat list

# Delete a link (or more):
goat delete h4xdir lojban

# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents

# Delete all saved links:
goat nuke

# Delete broken links:
goat fix

0

新しいシェルを起動せずに、異なるプロジェクトに対して同じことをしたい。

あなたの場合:

cd /home/artemb

the_scriptを次の名前で保存します。

echo cd /home/artemb

次にそれを起動します:

\`./the_script\`

次に、同じシェルを使用してディレクトリに移動します。



0

パスを宣言します。

PATH='/home/artemb'     
cd ${PATH}

0

PWDスクリプトに書き込んでエクスポートするだけで、変更が持続します。

export PWD=/your/desired/directory
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.