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

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

ただいまの
回答率

90.53%

  • bash

    784questions

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

  • sh

    337questions

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

  • シェル

    279questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 910

fullmated

score 13

前提・実現したいこと

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

#ファイル名: change_history.sh
#!bin/bash

if [ $# -ne 1 ]; then
  echo "\033[0;31mThe number of argument must be one! Set the argument to normal or lpic.\033[0;39m\n"
  exit 1
fi

# 通常のとき
if [ $1 = 'normal' ]; then
  eval "history -a" # write down the cache on HISTFILE
  HISTFILE=~/.bash_history
# eval "HISTFILE=~/.bash_history"
  eval "history -c" # delete cache
  eval "history -n" # read HISTFILE and set up new cache
# 通常用とは違うHISTFILEにしたいとき
elif [ $1 = 'lpic' ]; then
  eval "history -a"
  HISTFILE=~/.bash_history_for_lpic
# eval "HISTFILE=~/.bash_history_for_lpic"
  eval "history -c" 
  eval "history -n"
else
  echo "\033[0;31mThe argument is invalid!\033[0;39m\n"
fi

exit 0

発生している問題・エラーメッセージ

しかし実際に実行しても、HISTFILEが変更されません。

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/31 19:38

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

    キャンセル

  • 2017/01/31 20:57

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

    キャンセル

  • 2017/02/01 00:10

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

    キャンセル

0

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

#!bin/bash

# 引数チェック
if [ $# -ne 1 ]; then
  echo -e "\033[0;31mThe number of argument must be one! Set the argument to normal or lpic.\033[0;39m\n"
  return 2>&- || exit
fi

# 引数によって保存先を決める
declare histfile # path to save history

if [ $1 = 'normal' ]; then
  histfile=~/.bash_history
elif [ $1 = 'lpic' ]; then
  histfile=~/.bash_history_for_lpic
else
  echo -e "\033[0;31mThe argument is invalid!\033[0;39m\n"
  return 2>&- || exit
fi

# historyのキャッシュを保存して、HISTFILEを切り替える
eval "history -w $HISTFILE" # write down the cache on HISTFILE
eval "history -c" # delete cache
export HISTFILE=$histfile
eval "history -r $HISTFILE" # read HISTFILE and set up new cache

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/31 20:59

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

    キャンセル

  • 2017/02/01 00:02

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

    キャンセル

  • 2017/02/01 08:51

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

    キャンセル

  • 2017/02/04 03:25

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

    キャンセル

同じタグがついた質問を見る

  • bash

    784questions

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

  • sh

    337questions

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

  • シェル

    279questions

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