2012年5月7日月曜日

UNIX今日の技 - UNIX今日の技/シェル


概説

今迄「コマンド」と一口で言っていましたが, コマンドには大きく分けて 「外部コマンド」と「内部コマンド」の2種類があります.

外部コマンドとはシステム上に実際にファイルとして存在しているコマンドです.

  • ls (/bin/ls)
  • grep (/usr/bin/grep)
  • zsh (/usr/local/bin/zsh)

内部コマンドとは実際にファイルを呼ぶのではなく, シェル自身が動作を返すコマンドです.

「どのコマンドがどっち」とかは全然知っておく必要はありません. (というか, 慣れてくると大体分かるようになります.) でもまあ, 言葉の意味を知っておいたら便利かもしれません.


SoftICEのは何ですか?

さて, 「man builtin」で bsh, csh の代表的な内部コマンドを調べることができます. 中には echo のように外部コマンドとして用意されているけれども 多くのシェルで内部コマンドとして実装されているものもあります. その場合は通常は内部コマンドが呼ばれ, 外部コマンドを使いたい場合は 「/bin/echo」を用います.

「command echo」, 「\echo」などでどちらが呼ばれるかは シェルの種類によって異なるようです.

                zsh  bash  tcsh  echo          ●    ●    ●  builtin echo  ●    ●   (なし)  \echo         ●    ●    ○  command echo  ○    ●    ○      /bin/echo     ○    ○    ○      (●:内部, ○:外部)  

which コマンド(実際に実行されるコマンドを表示)

さて今「echo」と打ち込めば, それは何処の「echo」が実行されるのでしょうか? 打ちこんだコマンドが実際にどのように実行されるかを確認したい場面では「which」コマンドを使います.


シェルスクリプトは何ですか?
  % which echo  echo: shell built-in command #内部コマンド  
  % which /bin/echo  /bin/echo                    #外部コマンド  
  % alias echo='echo -n'    % which echo                 #エイリアス  echo: aliased to echo -n    % which -a echo              #全て表示  echo: aliased to echo -n  echo: shell built-in command  /bin/echo  

which 自身は内部コマンドですが, 外部コマンドにも which(/usr/bin/which) があります. しかし外部コマンドの方はエイリアスの展開などができないので 普通使うことはないと思います.

コマンドの存在をチェックする

初期化スクリプトやシェルスクリプトにおいてそのコマンドが存在するかを調べることができます. 例えば, 以下のどちらかの文を ~/.zshrc に入れておくと, vim が使用できる環境では「vi」で vim が起動するようになります.


"システム·ショックへようこそ"
  if which vim >& /dev/null ; then      alias vi="vim"    export EDITOR="vim"  fi  
  if [ -x `which vim` ]; then      alias vi="vim"    export EDITOR="vim"  fi  

これら二者はほぼ等価です. 前者は出力された文字列ではなく which コマンドの戻り値を使用しています. UNIX 的にはこちらの方がスマートだと思います.

後者は「which によって出力された文字列をファイルパスとして見たときに, 実行権限があるか」という判定をしています. ただ, which コマンドはそれ自体ファイルの実行権限をチェックしていますので, この if 文におけるチェック機構は本来ならば冗長であると言えるでしょう. しかしこちらの方が構文がスマートに見えるので, 私はこちらがお気に入りです.

絶対パスを変数に入れる

変数の内容にコマンドの絶対パスが要求される場合, which を用いることで計算機による環境の違いを吸収することができます.


例えば gcc が /usr/bin/gcc に入るか, /usr/local/bin/gcc に入るかは システムによって(あるいは管理者によって)異なりますが,

  export CC=`which gcc`  

としておくと, 実際にインストールされているパスを自動的に変数に格納します.

補足:whence(zsh 内部コマンド)

zsh ではコマンド名解釈の情報を包括的に調べるためのコマンド「whence」が 用意されていて,

  • 「which」=「whence -c」
  • 「where」=「which -a」=「whence -ca」

のように等価になっています. (参考:man zshbuiltins)



These are our most popular posts:

UNIX今日の技/シェル

2011年7月11日 ... 中ボタンでのペースト; 複数のジョブを連続して実行する; 実行してしまったコマンドの後 で何かをさせたいと思ったときは? ... 私の場合、長いファイル名の一部を変更する時 など [C-k][C-y][C-y] をよく使います。 ... 何処かから設定を拾ってこれるのなら試して みるのも面白いでしょう。 ... mv や rm などではワイルドカードがどのように展開されるか という事に十分注意を払う必要があります。 .... のように使う(追記する場合は「ls list. txt」); コマンドに出力するものを「パイプ」と呼び「ls | grep 」のように使う ... read more

UNIX/Linux入門 - Wikibooks

引数がどのように解釈されるかはコマンドによって異なるが、よくある使いかたとして、 コマンドの挙動を変更するための ... 以降は標準出力の行き先をdate.txtというファイル に切り替える指示である。 ... 標準入力を使うコマンドの例も見てみよう。wcは、標準 入力から受け取ったテキストの行数・語数・バイト数を標準出力に .... 作成したファイル やディレクトリが実際にディレクトリ内に存在するかどうかを確かめるために用いることが できる。 ..... テキストはクリエイティブ・コモンズ 表示-継承ライセンスの下で利用可能 です。追加の ... read more

田村仁研究室 日本工業大学創造システム工学科

このような内容のテキストファイルを用意した後,次のコマンドでそのテキストファイルに 実行属性を付与する. ... は,カレントディレクトリの指定を意味し,「現在開いている ディレクトリの中に」存在するスクリプトファイルの実行をシェルに指示するために必要で ある. .... 出力ではなく,逆にファイルからデータを読み込みたい場合には,次のように 記述すれば,変数hogeに,ファイルに書かれた ... この条件の最初に書いてあるものは ,それに続くファイル名で指定されたファイルが,実際に存在するかどうかという条件を 示している ... read more

入出力

多くのコマンドはファイルからデータを入力することができますが、特に何も指定しないと 、キーボードからの入力となります。 ... wcコマンドは入力を読み取って、行数は1、単語 数は2、バイト数は25と表示しました(日本語のテキストなのですが、英語などと違い ... 例えば、次のようなコマンドを入力すると、結果がusr c-e.txtに出力されます(画面には 結果は表示されません、表示させたいとき ... 出力のリダイレクト大なり記号()は、指定 したファイルを新規作成するか、あるいは既存の場合は上書きしますので注意が必要 です。 read more

Related Posts



0 コメント:

コメントを投稿