MW211 EXIT

devlog
Linux/ZIP圧縮中の一時ファイル
2013年07月29日
環境によるようだが、「zip」コマンドで圧縮中に、
生成先に一時ファイル「zi******」(*の部分はランダムな英数字)が
作成される場合がある。
(完成すると指定したファイル名に名称変更される)

これを「zip -b 一時格納先」といった感じで、「-b」オプションで
指定した場所に追い出すことができる。(完成すると所定の位置に戻ってくる)

但し、「zip -」により標準出力する場合(Web画面ダウンロードの場合など)には、
「-b」は効かない模様。
分類:Linuxシェル
シェル/「$(())」は「expr」
2013年07月13日
以前、『「$(())」は「expr」コマンドと同等になる、これは便利。』と書いたが
これには落とし穴があった。
8進数の扱いについてだ。

こんな感じ。
┌──────────────────────────────────────┐
│$ echo `expr 08 + 1`                                                     →9│
├──────────────────────────────────────┤
│$ echo $((08 + 1))                                    →Syntax error: 08 + 1│
└──────────────────────────────────────┘

先頭に「0」がつくと8進数と認識されるわけだが
8進数は「0~7」のみで数字を構成するから、「8」はエラーとなる。

でも、「expr」だと、10進数と解釈してくれるみたいだ。
分類:Linuxシェル
C言語/ファイルのフルパスを取得する方法
2013年05月05日
┌──────────────────────────────────────┐
│ls /aaa/bbb/*.txt                                                           │
└──────────────────────────────────────┘
上記みたいにフルパスで指定すれば、フルパスで結果が得られる
┌──────────────────────────────────────┐
│/aaa/bbb/ccc.txt                                                            │
└──────────────────────────────────────┘

でも、「/aaa/bbb」とかにいて、相対パスつまり「ls」ってだけコマンドを打つと
ファイル名しか取得できない。
┌──────────────────────────────────────┐
│ccc.txt                                                                     │
└──────────────────────────────────────┘

こういう場合は、以下のようにすればフルパスがとれるらしい。
┌──────────────────────────────────────┐
│find `pwd`                                                                  │
└──────────────────────────────────────┘

「find」コマンドに従って絞り込みもできる。
┌──────────────────────────────────────┐
│find `pwd` -name "ccc.txt"                                                  │
└──────────────────────────────────────┘

パイプを使うのもありだ。
┌──────────────────────────────────────┐
│find `pwd` | grep "ccc.txt"                                                 │
└──────────────────────────────────────┘

ちなみにディレクトリを指定するとその配下のファイル名のみが表示されるが。
┌──────────────────────────────────────┐
│ls ../aaa/bbb                                                               │
├──────────────────────────────────────┤
│ccc.txt                                                                     │
└──────────────────────────────────────┘

ワイルドカードで配下ファイルを指定してやると、そこまでのパスも表示されるようだ。
┌──────────────────────────────────────┐
│ls ../aaa/bbb/*                                                             │
├──────────────────────────────────────┤
│../aaa/bbb/ccc.txt                                                          │
└──────────────────────────────────────┘
分類:Linuxシェル
シェル/囲いの違い
2013年04月18日
シェルにおいてはいろいろな記号で変数や処理を囲うことになるが
この違いをまとめた。

まず、変数は「$変数」でも「${変数}」でもよい。
「{}」の扱いはこの程度の認識でOK。

それ以外の各記号の違いはこんな感じとなる。
┌───┬────┬────┬────────────────────────┐
│ 囲い │変数展開│処理展開│                      説明                      │
├───┼────┼────┼────────────────────────┤
│ '■' │   ×   │   ×   │純粋な文字列として扱われる                      │
├───┼────┼────┼────────────────────────┤
│  ■  │   ○   │   ×   │(囲いなし)                                      │
├───┼────┼────┼────────────────────────┤
│ "■" │   ○   │   △   │                                                │
├───┼────┼────┼────────────────────────┤
│ `■` │   ×   │   ○   │ネストができない旧型                            │
├───┼────┼────┼────────────────────────┤
│$(■) │   ×   │   ○   │二重括弧で四則演算もできる新型                  │
└───┴────┴────┴────────────────────────┘

変数展開についてのそれぞれの結果は以下の通り。
┌──────────────────────────────────────┐
│$ I=8;echo '$I';                             →展開なし「$I」               │
│$ I=8;echo $I;                               →変数展開「8」                │
│$ I=8;echo "$I";                             →変数展開「8」                │
│$ I=8;echo `$I`;                             →処理展開「ash: 8: not found」│
│$ I=8;echo $($I);                            →処理展開「ash: 8: not found」│
└──────────────────────────────────────┘

二重括弧による四則演算についてのそれぞれの結果は以下の通り。
┌──────────────────────────────────────┐
│$ echo '(1 + 1)';                                              →「(1 + 1)」│
│$ echo (1 + 1);     →「ash: Syntax error: word unexpected (expecting ")")」│
│$ echo "(1 + 1)";                                              →「(1 + 1)」│
│$ echo `(1 + 1)`;                                    →「ash: 1: not found」│
│$ echo $((1 + 1));                                                   →「2」│
├──────────────────────────────────────┤
│$ echo $(expr 1 + 1);                                                →「2」│
│$ echo `expr 1 + 1`;                                                 →「2」│
└──────────────────────────────────────┘
「$(())」は「expr」コマンドと同等になる、これは便利。
分類:Linuxシェル
シェル/クーロン(3)中身
2013年03月13日
「日時 シェルスクリプト」の順に記述する
┌──────────────────────────────────────┐
 #分 時 日 月 曜  シェルスクリプト                                            │
│ 0  0  1  1  0  /xxxx/xxxx.sh(値は最小値)                                   │
│59 23 31 12  6  /xxxx/xxxx.sh(値は最大値)                                   │
└──────────────────────────────────────┘

行頭に「#」をつけるとコメント行(無効行)となる。

曜日(曜)は「0=日曜日、1=月曜日、…、6=土曜日」である。

「*」を指定するとすべて対象となる(ワイルドカード)

例えば、月初(朔日)の正子(毎月01日の00時00分)に時刻したい場合は、以下の通り。
┌──────────────────────────────────────┐
 #分 時 日 月 曜  シェルスクリプト                                            │
│ 0  0  1  *  *  /xxxx/xxxx.sh                                               │
└──────────────────────────────────────┘
分類:Linuxシェル
シェル/クーロン(2)実行
2013年03月12日
cronを起動する。
┌──────────────────────────────────────┐
│# crond start                                                               │
└──────────────────────────────────────┘

cronを停止する。
┌──────────────────────────────────────┐
│# crond stop                                                                │
└──────────────────────────────────────┘

cronを再起動する。
┌──────────────────────────────────────┐
│# crond restart                                                             │
└──────────────────────────────────────┘

cronの実体パスを変更する。
┌──────────────────────────────────────┐
│# crond -c パス                                                             │
└──────────────────────────────────────┘
分類:Linuxシェル
シェル/クーロン(1)設定
2013年03月11日
「crontab」の内容を確認する。
┌──────────────────────────────────────┐
│# crontab -l                                                                │
└──────────────────────────────────────┘

「crontab」の内容を変更(または追加)する。
┌──────────────────────────────────────┐
│# crontab -e                                                                │
└──────────────────────────────────────┘

「crontab」を削除する(全部削除されるから注意)。
┌──────────────────────────────────────┐
│# crontab -r                                                                │
└──────────────────────────────────────┘

なお、それぞれ「crond」へのパスが必要。(「/etc/rc.d/init.d/」とか)

また、既定の「crontab」を使用せずに、
ユーザ定義の「crontab」を使用することもできる。
その場合は、任意の場所にエディタ等で同じような内容を記述保存する。
そして実行時に「-c」でパスを指定してあげる。
分類:Linuxシェル
シェル/リンクの見分け方
2013年03月10日
シンボリックリンクの見分け方。「ls -l」を実行する。
┌──────────────────────────────────────┐
│$ ls -l                                                                     │
│-rw-rw-r--    1 root     root            2 Jan  1  1970 A                   │
│lrwxrwxrwx    1 root     root            2 Jan  1  1970 B -> A              │
│-rw-rw-r--    1 root     root            2 Jan  1  1970 Z                   │
└──────────────────────────────────────┘
左から一番目のファイル属性の一番左がシンボリックリンクを表しており、
「l」(小文字のL)となっていればそれがシンボリックリンク。
また、リンク名の横に「-> ファイル名」がついているので一目瞭然。


ハードリンクの見分け方。「ls -l」を実行する。
┌──────────────────────────────────────┐
│$ ls -l                                                                     │
│-rw-rw-r--    3 root     root            2 Jan  1  1970 A                   │
│-rw-rw-r--    3 root     root            2 Jan  1  1970 B                   │
│-rw-rw-r--    3 root     root            2 Jan  1  1970 C                   │
│-rw-rw-r--    1 root     root            2 Jan  1  1970 Z                   │
└──────────────────────────────────────┘
左から二番目の項目がハードリンク数。
上記でいえば「A、B、C」が互いにハードリンクしているため「3」となっている。
分類:Linuxシェル
シェル/シンボリックリンク・補足
2013年03月09日
コピーとハードリンクとシンボリックリンクの比較。
┌───────┬───────┬───────┬──────────────┐
│    コピー    │ ハードリンク │ シンボリック │                            │
├───────┼───────┼───────┼──────────────┤
│$ echo "a" > A│$ echo "a" > A│$ echo "a" > A│←「A」を生成               │
│$ cat A       │$ cat A       │$ cat A       │←「A」の中身を確認         │
│a             │a             │a             │                            │
├───────┼───────┼───────┼──────────────┤
│$ cp A B      │$ ln A B      │$ ln -s A B   │←「B」を生成する           │
│$ cat B       │$ cat B       │$ cat B       │←「B」の中身を確認         │
│a             │a             │a             │←「A」の中身と同じ         │
├───────┼───────┼───────┼──────────────┤
│$ echo "b" > B│$ echo "b" > B│$ echo "b" > B│←「B」の中身を変更         │
│$ cat B       │$ cat B       │$ cat B       │                            │
│b             │b             │b             │                            │
│$ cat A       │$ cat A       │$ cat A       │←「A」の中身を確認         │
│a             │b             │b             │                            │
└───────┴───────┴───────┴──────────────┘
コピーの場合は、独立した二つのデータが生成されるので、互いに影響を与えない。
ハードリンクの場合は、一つのデータを共有するので、互いに影響を与える。
シンボリックリンクの場合は、シンボルが実体のようにふるまう。
よって、シンボルを更新すると実体が更新される。

シンボリックリンクの実体がなくなると、シンボルを指定しても該当なしエラーとなる。
┌──────────────────────────────────────┐
│$ ls -l                                                                     │
│lrwxrwxrwx    1 root     root            2 Jan  1  1970 B -> A              │
│$ rm A                                                                      │
│$ cat B                                                                     │
│cat: B: No such file or directory                                           │
└──────────────────────────────────────┘
分類:Linuxシェル
シェル/シンボリックリンク
2013年03月08日
リンクを生成する。
┌──────────────────────────────────────┐
│$ ln -s ファイル名 リンク名                                                 │
└──────────────────────────────────────┘

リンクの内容を確認する。
┌──────────────────────────────────────┐
│$ ls -l                                                                     │
│lrwxrwxrwx    1 root     root          8 Jan  1  1970 リンク名 -> ファイル名│
└──────────────────────────────────────┘

リンクを削除する。
┌──────────────────────────────────────┐
│$ rm リンク名                                                               │
└──────────────────────────────────────┘

ちなみに「-s」をつけないとハードリンクをの生成となる。
┌──────────────────────────────────────┐
│$ ln ファイル名 リンク名                                                    │
└──────────────────────────────────────┘

以下の違いをまとめてみた。
・コピー            …実体が二つになる。
・ハードリンク      …実体は一つで窓口が二つになる。
                      一方の窓口から変更をすると、他方へも反映された形となる。
                      窓口がすべてなくなった時点で実体もなくなる。
・シンボリックリンク…ショートカット(実体がなくなってもリンク切れ状態で残る)。
                      ハードリンクに対してソフトリンクとも呼ばれる。

注意点としては
・ハードリンクはパーティーションをまたがると使えない。
・シンボリックリンクが使えない特殊なシステムもある。
分類:Linuxシェル
前へ 1 2 3 次へ