
Ubuntu日本語フォーラム

ログインしていません。
Ubuntu9.10を使用しております。
CentOSでは、「set」コマンドでシェル変数と環境変数を表示できておりましたが、
Ubuntuですと、表示されません。
ちなみに「env」コマンドで環境変数は表示されました。
ubuntuで、シェル変数を表示するにはどのようにしたらよろしいでしょうか?
ご教授願いします。
オフライン
> Ubuntu9.10を使用しております。
私の環境(AMD64、デフォルトのbash)では、1万行を越える設定が表示されます。
ちなみに、Fedora12では、百数十行。
$ set |head -n 50
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION=/etc/bash_completion
BASH_COMPLETION_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="0" [2]="33" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.0.33(1)-release'
COLORTERM=gnome-terminal
COLUMNS=159
COMP_WORDBREAKS=$' \t\n"\'><=;|&(:'
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-XBUCN8CQjo,guid=f42db59aaaf873842c8ca7094b546e62
DESKTOP_SESSION=gnome
DIRSTACK=()
DISPLAY=:0.0
EUID=1000
GDMSESSION=gnome
GDM_KEYBOARD_LAYOUT=jp
GDM_LANG=ja_JP.UTF-8
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_KEYRING_PID=1988
GNOME_KEYRING_SOCKET=/tmp/keyring-FIuZFf/socket
GROUPS=()
GTK_IM_MODULE=ibus
GTK_MODULES=canberra-gtk-module
GTK_RC_FILES=/etc/gtk/gtkrc:/home/imura/.gtkrc-1.2-gnome2
HISTCONTROL=ignoreboth
HISTFILE=/home/imura/.bash_history
HISTFILESIZE=500
HISTSIZE=500
HOME=/home/imura
HOSTNAME=ubuntu
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=ja_JP.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=24
LOGNAME=imura
LS_COLORS='rs=0:di=01;34:ln=01;36:hl=44;37:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:'
MACHTYPE=x86_64-pc-linux-gnu
MAILCHECK=60
OPTERR=1
OPTIND=1
ORBIT_SOCKETDIR=/tmp/orbit-imura
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
bash: set: write error: Broken pipe
オフライン
通常使う物は定義づけられているし常時使う物や他から参照するものは環境変数へexportさせれば良いかも。
siさんのが教示された物を80行足らずとenvde表示された行をソートして比較、差分してCentOSの環境と照らし合わせれば、OSの(シェル)の環境の違いが見えてくるかも。
オフライン
siさん、hir0さん
お返事ありがとうございます。
原因がわかりました。
$ set
これだけで実行していたので、一番最後まで表示されていたのが
勘違いのはじまりだったようです。
setで表示される最後の記述はスクリプトだったので、変数指定がみつからなかったです。
$ set | head
等で実行すると先頭から表示されましたので、変数の指定を確認できました!!
ご教授ありがとうございました!!
シェル変数にからむことですが、
誰かわかる方がいらっしゃればアドバイスください。
setコマンドでは、シェル変数と環境変数が同時に表示されると
思うのですが、シェル変数だけを表示するコマンドってあるのでしょうか?
環境変数だけであれば、envコマンドで良いと思いますが・・・。
以上、宜しくお願い致します。
オフライン
こんにちは。
linuxman による投稿:
setコマンドでは、シェル変数と環境変数が同時に表示されると
思うのですが、シェル変数だけを表示するコマンドってあるのでしょうか?
環境変数だけであれば、envコマンドで良いと思いますが・・・。
sh系(bashも)では、「exportしたシェル変数」「シェル変数」という区切りしかないような感じですね。この辺は、環境変数と変数の管理が異なるcsh系とは異なりそうです。
そこで。setにて、全ての変数を参照できることがわかっていて、かつ、export -pにて、exportした変数がわかるので、それらを適当に組み合わせて・・・
set | ( while read a ; do b="^`echo ${a} | cut -d'=' -f 1`=" ; export -p | cut -d " " -f 2- | grep -q "${b}" ; if test "$?" -ne "0" ; then echo ${a} ; fi ; done ;)と、すると、現シェルの変数全体から、子プロセスで起動されたシェル内でexportされているもの(現シェルの ではないです)を除いたものの一覧が取れます。こんな感じで、ぐりぐりやるしかないのかなぁ と思うところです。
# とりあえず、思いつくまま組み立てただけなので、遅いです(無駄なプロセスの起動も多いし・・・。関数があるど駄目かも。)
オフライン
#4のlinuxman による投稿:
シェル変数だけを表示するコマンドってあるのでしょうか?
以下、bashということで。
専用コマンドが既にあるのかもしれませんが、頭の体操のつもりで書きます。
現在のシェルでsetした結果と、子のシェルを起動しsetした結果をdiffすると、理論上できそうな気がします。
set > 1.txt bash -c -i "set > 2.txt" diff -U 0 1.txt 2.txt
これで十分ですが、意識したくない変数の差分を除去し、一時ファイルに/tmpを使ったりすると、
EXCEPTION_VARS='EXCEPTION_VARS|FUNCNAME|BASH_LINENO|OLDPWD|PPID|SHLVL|_|PIPESTATUS|BASH_EXECUTION_STRING'
set | grep -v -E "^(${EXCEPTION_VARS})=" > /tmp/1.txt
bash -c -i "set | grep -v -E \"^(${EXCEPTION_VARS})=\" > /tmp/2.txt"
diff -U 0 /tmp/1.txt /tmp/2.txt | grep '^[-+][^-+]'とか。
いまいち洗練されてないです。より簡単な方法はないのでしょうかね。
weykさん、STGSAGWANさん
ご返事ありがとうございます。
参考になります。
専用のコマンドがほしいものですね^^
もう一つご質問ですが、以下わかるかた
ご教授願います。
PS1はシェル変数
HISTSIZEはシェル変数
PATHは環境変数
という解釈でよろしいのでしょうか。
ただ、PATHが環境変数だった場合、エクスポートせず、
PATH=$PATH:/dir1 等でパスをとおすことが
できるので、そこが不明です。
ここらへんが整理できておりませんので、
少し説明していたきますと助かります。
宜しくお願い致します。
オフライン
追記ですが、
よく書籍等で
PS1、HISTSIZE、PATHは環境変数と書かれています。
$ env | grep PS1
$ env | grep HISTSIZE
とやっても表示されません。
$ echo $HISTSIZE
500
と結果になり、
$ HISTSIZE=300
$ echo $HISTSIZE
300
シェル変数での設定となります。
シェル変数なのか環境変数なのかがしっくりきません。
ご教授お願い致します。
オフライン