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

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

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

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

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

Q&A

解決済

2回答

2314閲覧

シェルスクリプトを使ってシェル変数を変更したい

fullmated

総合スコア19

bash

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

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

0グッド

0クリップ

投稿2017/01/31 09:51

編集2017/01/31 15:15

###前提・実現したいこと
historyコマンドで表示されるデータのパスを用途によって変更したいため、シェルスクリプトを使ってシェル変数HISTFILEを変更しようと考え、以下に示すコードを作成しました。簡単に説明すると、
・第一引数に文字列normalが設定されたら、HISTFILEに~/.bash_historyをセットする
・第一引数に文字列lpicが設定されたら、HISTFILEに~/.bash_history_for_lpicをセットする
というスクリプトです。
なぜこのようなスクリプトを作ったかというと、LPICの勉強のために実行したコマンドのhistoryを別にしたかったからです。

bash

1#ファイル名: change_history.sh 2#!bin/bash 3 4if [ $# -ne 1 ]; then 5 echo "\033[0;31mThe number of argument must be one! Set the argument to normal or lpic.\033[0;39m\n" 6 exit 1 7fi 8 9# 通常のとき 10if [ $1 = 'normal' ]; then 11 eval "history -a" # write down the cache on HISTFILE 12 HISTFILE=~/.bash_history 13# eval "HISTFILE=~/.bash_history" 14 eval "history -c" # delete cache 15 eval "history -n" # read HISTFILE and set up new cache 16# 通常用とは違うHISTFILEにしたいとき 17elif [ $1 = 'lpic' ]; then 18 eval "history -a" 19 HISTFILE=~/.bash_history_for_lpic 20# eval "HISTFILE=~/.bash_history_for_lpic" 21 eval "history -c" 22 eval "history -n" 23else 24 echo "\033[0;31mThe argument is invalid!\033[0;39m\n" 25fi 26 27exit 0

###発生している問題・エラーメッセージ
しかし実際に実行しても、HISTFILEが変更されません。

$ sh ~/.change_history.sh lpic $ echo $HISTFILE /Users/user/.bash_history

おそらくこのシェルスクリプトを実行すると、子プロセスが生成されそのプロセス内の変数としてHISTFILEが扱われてしまっているためかな〜?と予想しているのですが、解決策が思い当たりません。
どなたかご教授のほどをお願いいたします。。。

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

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

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

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

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

guest

回答2

0

解決後のコードです。使い方は以下の通り。
$ source this.sh {normal or lpic}

bash

1#!bin/bash 2 3# 引数チェック 4if [ $# -ne 1 ]; then 5 echo -e "\033[0;31mThe number of argument must be one! Set the argument to normal or lpic.\033[0;39m\n" 6 return 2>&- || exit 7fi 8 9# 引数によって保存先を決める 10declare histfile # path to save history 11 12if [ $1 = 'normal' ]; then 13 histfile=~/.bash_history 14elif [ $1 = 'lpic' ]; then 15 histfile=~/.bash_history_for_lpic 16else 17 echo -e "\033[0;31mThe argument is invalid!\033[0;39m\n" 18 return 2>&- || exit 19fi 20 21# historyのキャッシュを保存して、HISTFILEを切り替える 22eval "history -w $HISTFILE" # write down the cache on HISTFILE 23eval "history -c" # delete cache 24export HISTFILE=$histfile 25eval "history -r $HISTFILE" # read HISTFILE and set up new cache

追加参考
http://omoshiro-joho.com/tech-center/tips/tips_200408170045.html

投稿2017/01/31 10:40

編集2017/01/31 11:12
fullmated

総合スコア19

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

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

otn

2017/01/31 11:59

そもそも、勉強用の別アカウントを作った方が良いように思います。
fullmated

2017/01/31 15:02

補足のご回答ありがとうございます。 確かにその方が良かったかもしれません。拙案ですが、環境がmacOSなのもあって新しいアカウントを作るとユーザーの切り替えが面倒かと思ってこのようにしました。ターミナルを2つ立ち上げてそれぞれでhistoryの記録が取れれば…というのが私の考えでした。 vagrant+CentOSの導入なども選択肢として考えられるんでしょうかね…。
otn

2017/01/31 23:51

> ユーザーの切り替えが面倒かと思って ターミナルから、 su - 新ユーザ でいいかと思います。
fullmated

2017/02/03 18:25

なるほど…そうすればよかったんですね。 色々と考え過ぎていました。 ご教示いただきありがとうございます。
guest

0

ベストアンサー

http://qiita.com/soarflat/items/d5015bec37f8a8254380

bashならexportsコマンドを使ってみてはどうでしょうか?

投稿2017/01/31 09:55

編集2017/01/31 09:55
miyabi-sun

総合スコア21158

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

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

fullmated

2017/01/31 10:38

おっしゃる通り、 sourceコマンドを使い、exportをコードに導入することで解決できました。 ありがとうございます!
otn

2017/01/31 11:57

source コマンドが肝で、HISTFILEはシェル変数なので、exportは不要です。
fullmated

2017/01/31 15:10

export・・・環境変数を設定するコマンド source・・・引数に与えられたファイルに書かれた文字列を一行ずつ自分の手でタイプしたのと同じこと であると認識いたしました… sourceを使えばシェル変数が設定できる理屈が分かったような気がします。 補足の方、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問