質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

3回答

7824閲覧

現在のシェル環境下でシェルスクリプト内のcdコマンドを実行してディレクトリを移動する方法

free_coder

総合スコア16

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2019/04/17 11:09

現在のシェル環境下でシェルスクリプト内のcdコマンドを実行しディレクトリの移動を行いたいと思っております。
上記の文では少し分かりにくいかと思いますので、細かく説明致します。
例えば、「move」と言うシェルスクリプトファイルに「cd 〇〇」コマンドを記述し、任意のディレクトリへ移動したいと考えております。
しかし、プロセスの環境が異なる為、実際に使用しているシェル環境下ではディレクトリの移動が行われません。
どうすれば実際の環境下でシェルスクリプト内のコマンドが実行されるのでしょうか?
ちなみに「source」コマンドを使用すれば現在のシェル環境下でシェルスクリプトファイルが実行される事は承知しております。
「source」コマンド以外の方法はないのでしょうか?
どなたかご存知な方がいらっしゃいましたら、ご教授頂けますと大変幸いでございます。
どうぞ宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

一応、そういうTIPSがありますが、可能であればシェルスクリプトでなく、aliasfunctionにする方が良いです。

TIPSとしては、まず、~/.bashrc等に1行追加。

sh

1trap "source $HOME/.command" SIGUSR1

目的のスクリプトで、

sh

1#!/bin/sh 2~~~ 3echo cd 目的ディレクトリ > $HOME/.command 4kill -SIGUSR1 $PPID 5~~~

と、シグナルを使って目的のシェルにsourceさせます。

$PPIDを使っているので、cdを効かしたいシェルの直接の子プロセスとして目的スクリプトを起動する必要があります。
直接の子プロセスであるとは限らない場合は、「cdを効かしたいシェル」のPIDを知るための何らかの工夫が必要です。

投稿2019/04/17 13:08

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/04/17 13:41 編集

> aliasでは引数部分が固定化されてしまうので、 そのレベルのニーズであれば、関数が良いです。 foo(){ if [ "$1" = aaa ] then cd /tmp else cd ~ fi } とか。これを、~/.bashrc等に書く。 すると、関数fooが定義されるので、foo とすれば cd ~ になるし、foo aaa とすれば cd /tmp になります。
free_coder

2019/04/17 13:25

ご回答頂きましてありがとうございます。 正直、otnさんのご説明に私の知識力が追いついていない為、一つずつ調べながら試みさせて頂きたいと思います。 丁寧にご説明頂き、誠にありがとうございます。
otn

2019/04/17 13:42

コメントに追記しました。
free_coder

2019/04/17 13:52

ありがとうございます。
guest

0

例えばmoveが下記のようなファイルであれば移動できます。

bash:move

1#!/bin/bash 2cd /anydirectory 3exec bash

ただしbashのプロセスを入れ替える形になってしまうため、厳密には実行後のプロセスは異なるbashのプロセスになりますがこれで問題ないでしょうか?

投稿2019/04/17 11:32

編集2019/04/17 11:35
amanoese

総合スコア132

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

free_coder

2019/04/17 12:09

ご回答頂き誠にありがとうございます。 この方法は知りませんでした。 execコマンドの処理がどの様な物なのかを私が理解できていませんので、少し調べて見ることにします。 本当にありがとうございました。
amanoese

2019/04/17 12:20

すみませんもし、moveを $ source ./move のように実行しているならば結局はサブプロセスのbashに過ぎずshellは置換されないみたいです。 $ exec ./move のようにしてに実行すれば現在のshellと入れ替えることがきますが…少し求められている答えと違うかもしれません。すみません。
free_coder

2019/04/17 12:24

例え異なっていたとしても、新しい事を教えて頂けるだけでも大変助けられております。 丁寧にご教授頂き、誠にありがとうございます。
guest

0

追記

~$ cat ~/move #!/bin/bash cd /tmp/foo/bar$1 ~$ tree /tmp/foo /tmp/foo ├── bar1 ├── bar10 ├── bara └── baraz 4 directories, 0 files ~$ alias move alias move='source ~/move' ~$ move az /tmp/foo/baraz$ pwd /tmp/foo/baraz

一案です

例に挙げられているような単純なものであれば、aliasを利用されてはどうでしょう。

以下は、cd /tmpの後、pwdを実行をcdtmpという別名としています。

bash

1~$ alias cdtmp='cd /tmp/ ; pwd' 2~$ cdtmp 3/tmp 4/tmp$

参考
【初心者向け】エイリアスの設定方法

例に挙げられているmoveであれば、moveというalias名で以下のようにするといちいちsource ~/moveと入力しなくても良くなります。

/var/log$ ls ~/move /home/user/move /tmp/foo$ cat ~/move #!/bin/bash cd /tmp/foo /tmp$ alias move='source ~/move' /tmp$ cd /var/log /var/log$ pwd /var/log /var/log$ #↑ここまで準備↑ /var/log$ move /tmp/foo$ pwd /tmp/foo

投稿2019/04/17 12:31

編集2019/04/17 13:12
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

free_coder

2019/04/17 12:56

ご回答頂きましてありがとうございます。 上記の私の質問では記述しておりませんでしたが、私の目的としまして、cdコマンドの引数部分を可変的に扱えるシェルスクリプトを作成したいと考えておりました。 aliasでは引数部分が固定化されてしまうので、目的の処理の実現が難しいようです。 もう一度、aliasを使用してどうにか実現出来ないか試みて見たいと思います。 ありがとうございます。
Y.H.

2019/04/17 13:04 編集

あぁ、意味判りました。 <s>えっ。パラメーター普通に使えますよ。。。。</s>
free_coder

2019/04/17 13:11

普通のcdコマンドでも可変的なディレクトリ移動が可能なのは承知しているのですが、ある特定の作業下に置いて、より使いやすいコマンドの作成を考えております。 そのコマンドの処理の一部に、cdコマンドの引数をシェルスクリプト内において可変的に扱いたい部分が存在しており、現在悩まされております。 もう少し調べて見ようと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問