bashで小数点を比較する方法を紹介します。 1.問題点 小数点を比較したいのですが、下記の構文では期待する結果になりません。 #!/bin/bash A=0.1 B=0.2 if [ $A -gt $B ]; then echo "A > B" else echo "A <= B" fi 実行結果 ./test.sh ./test.sh: line 6: [: 0.1: 指数の表現を期待 A ということで、bashで小数点を比較する方法を紹介します。 2.bashで小数点を比較する bashで小数点を比較するには、echoとbcコマンドを組み合わせます。 #!/bin/bash A=0.1 B=0.2 if [ `echo "$A > $B" | bc` == 1 ]; then echo "A > B" else ... [
続きを読む]
Linuxでダミーファイルを作成する方法を紹介します。 1.問題点 開発システムの試験のため、Linux上でサイズの大きな(数GB)ダミーファイルを作成する必要が生じました。 が、短時間でサイズの大きいファイルを作成する方法が分かりません。 ということで、Linuxでダミーファイルを作成する方法を紹介します。 2.ダミーファイルを作成する ダミーファイルを作成するにはddコマンドを利用します。 ここでは1GBのダミーファイルを作成するサンプルを紹介します。 $ dd if=/dev/zero of=name bs=1M count=1000 ddは、ブロック単位でファイルを読み出し、オプション指定にしたがって変換し、ファイルに書き出すコマンドです。 以下、サンプルで指定したオプションの説明です。 "if"は、ファイル(またはデバイス)からデータを読み出すオプションです。"/dev/zero... [
続きを読む]
pkillで文字列マッチしない場合の対処方法を紹介します。 1.問題点 下記のようにフルパス指定でtest.shを実行しました。 $ /home/foo/test.sh psコマンドで見るとフルパスで実行されています。 $ ps -ef | grep test.sh foo 59476 57186 0 13:43 pts/52 00:00:00 /bin/bash /home/foo/test.sh pkillコマンドで、このtest.shをフルパスで指定したのですが、プロセスが終了しません。 $ pkill /home/foo/test.sh ということで、pkillで文字列マッチしない場合の対処方法を紹介します。 2.pkillで文字列マッチしない場合 pkillで指定する文字列パターンは「プロセス名」なので、パスは含みません。 よって、下記の記述であればプロセスは正常... [
続きを読む]
pkillを特定のプロセスに絞る方法を紹介します。 1.問題点 pkillはプロセス名を指定して強制終了させるためのコマンドです。 たとえば、実行中のtest.shを終了させる場合、 $ pkill test.sh とすればプロセスを終了できます。 ただ、プロセス名で検索するため、終了させたくない同名の他のプロセスまで終了してしまいます。 これを特定のプロセスに絞りたいのですが、方法が分かりません。 ということで、pkillを特定のプロセスに絞る方法を紹介します。 2.pkillを特定のプロセスに絞る pkillを特定のプロセスに絞る方法として、"-t"オプションで実行中のターミナル(TTY)を指定します。 $ pkill -t pts/59 test.sh または $ pkill --terminal pts/59 test.sh "-t"または"--terminal"は、ターミナルを指... [
続きを読む]
Linuxで文字列の特定部分を抜き出す方法を紹介します。 1.問題点 下記のように、lsコマンドでファイルの一覧を取得します。 # ls -l 合計 3 -rw-r--r--. 1 root root 0 6月 28 10:31 2019 aaa -rw-r--r--. 1 root root 0 6月 28 10:31 2019 bbb -rw-r--r--. 1 root root 0 6月 28 10:31 2019 ccc この出力から「6月」から「10」までの文字列 6月 28 10 を取得したいのですが、方法が分かりません。 ということで、Linuxで文字列の特定部分を抜き出す方法を紹介します。 2.文字列の特定部分を抜き出す 文字列の特定部分を抜き出すには、cutコマンドを利用します。 # ls -l | cut -c 30-37 6月 28 10 6月... [
続きを読む]
コマンドの実行結果をdiffする方法を紹介します。 1.問題点 次のlsコマンドの実行結果を2つ取得し、取得結果の差分をdiffで取得したいのです。 $ ls -1 /home/foo/test1 $ ls -1 /home/foo/test2 次のように実行結果をファイルに出力すれば簡単にdiffできるのですが、できればファイル出力なしで実施したいです。 $ ls -1 /home/foo/test1 > /home/foo/result1 $ ls -1 /home/foo/test2 > /home/foo/result2 $ diff /home/foo/result1 /home/foo/result2 ということで、コマンドの実行結果をdiffする方法を紹介します。 2.コマンドの実行結果をdiffする コマンドの実行結果をdiffするには、リダイレクションを使って、コマンドの... [
続きを読む]
grepで行番号だけを表示する方法を紹介します。 1.問題点 下記のtest.txtというファイルがあります。 test.txt aaa bbb ccc ddd eee このファイルをgrepコマンドで"ccc"を検索します。"-n"は行番号を表示するオプションです。 # grep -n ccc text.txt 実行結果 3:ccc この検索結果に表示された行番号「3」だけを表示させたいのですが、方法がわかりません。 ということで、grepで行番号だけを表示する方法を紹介します。 2.grepで行番号だけを表示する grepで行番号だけを表示するには、sedと組み合わせます。 # grep -n ccc test.txt | sed -e 's/:.*//g' 実行結果 3 sedでは、行番号以降のコロンから末尾までを削除しています。... [
続きを読む]
RPMをソースパッケージ(SRPM)からインストールする方法を紹介します。 1.問題点 lvコマンドをLinuxにインストールしたいのですが、利用しているアーキテクチャのrpmパッケージが存在しません。 ということで、ソースパッケージからインストールする方法を紹介します。 2.RPMをソースパッケージ(SRPM)からインストールする まず、ソースパッケージをダウンロードします。 今回利用したのはCentOS用の下記のパッケージです。 http://vault.centos.org/5.11/os/SRPMS/lv-4.51-8.1.src.rpm ソースパッケージ(SRPM)からインストールするには、"rpmbuild"を利用します。 rpmbuildがインストールされていない場合は、yumでインストールします。 # sudo yum install rpm-build rpmbuildコ... [
続きを読む]
tar.gzを展開せずに特定のファイルだけを見る方法を紹介します。 1.はじめに tar.gzファイルから特定のファイルだけを参照したいことがあると思いますが、アーカイブのサイズが大きいと、不要なファイルまで展開することになってしまいます。 また、実ファイルとして展開してしまうと、ちょっと参照したいだけのファイルも後で削除しなければならないため、無駄な作業が発生します。 できればアーカイブの状態で参照したいのですが方法が分かりません。 ということで、tar.gzを展開せずに特定のファイルだけを見る方法を紹介します。 2.tar.gzを展開せずに特定のファイルだけを見る tar.gzを展開せずに特定のファイルだけを見るには次のようにします。 gzip -d -c hoge.tar.gz | tar xOf - ファイル名 | less tarコマンドの"xOf"オプションの意味は次の通りです... [
続きを読む]
tar.gzから特定のディレクトリ・ファイルだけを取得する方法を紹介します。 1.問題点 仕事で、tar.gzファイルから特定のディレクトリ・ファイルのみを抽出する必要が生じたのですが、抽出する方法がわかりません。 ということで、tar.gzから特定のディレクトリ・ファイルだけを取得する方法を紹介します。 2.tar.gzから特定のディレクトリ・ファイルだけを取得する tar.gzから特定のディレクトリ・ファイルだけを取得する方法には、下記のようにします。 まず展開が正常に行われるか、tarコマンドの"t"オプションで事前確認します。 % gunzip -c hoge.tar.gz | tar tvf - gzipコマンドでも大丈夫です。 % gzip -d -c hoge.tar.gz | tar tvf - それでは実際にディレクトリ・ファイルを抽出してみます。 fooディレクトリだけ... [
続きを読む]
リトルエンディアン・ビッグエンディアンを判定する方法を紹介します。 1.はじめに エンディアンとは、複数のバイトを並べる順序(バイトオーダ)を指し、コンピュータの世界では、 リトルエンディアン ビッグエンディアン がよく使われます。 たとえば、"1234ABCD"という4バイトのデータを、バイト(8ビット)毎に上位から「12 34 AB CD」のように並ぶのがビッグエンディアン、下位から「CD AB 34 12」のように並ぶのがリトルエンディアンです。 たとえばIntelのx86はリトルエンディアンです。 ということで、リトルエンディアン・ビッグエンディアンを簡単に判定する方法を紹介します。 2.リトルエンディアン・ビッグエンディアンを判定する リトルエンディアン・ビッグエンディアンを判定するには、TeraTermなどのクライアントターミナルから下記を実行します。 % echo -n "1... [
続きを読む]
"ls -l"で表示される「合計」を「total」に変更する方法を紹介します。 1.問題点 lsコマンドに"-l"オプションを付与すると、 # ls -l 合計 23176 drwxr-xr-x 4 root root 94 6月 18 11:09 aaa drwxr-xr-x 2 root root 174 6月 12 14:17 bbb という風に、1行目に「合計」という文字列が表示されます。 事情があって、この文字列を「total」という半角英文字に変更したいのですが方法が分かりません。 ということで、"ls -l"で表示される「合計」を「total」に変更する方法を紹介します。 2.「合計」を「total」に変更する 「合計」を「total」に変更するには、環境変数"LC_MESSAGES"を利用して、 # export LC_MESSAGES="... [
続きを読む]
mmapしたメモリの値がcoreに出力されない場合の対処方法を紹介します。 1.問題点 C/C++プログラムがセグメンテーションフォルトしたとき、mmapしたメモリをgdbで参照したときに、値を設定しているにもかかわらず、0しか表示されない事象が発生しました。 2.対処方法 /proc/PID/coredump_filterを書き替えることで実現できるようです。 プログラム動作時のcoredump_filterは次のようになっています。 # cat /proc/6235/coredump_filter 00000033 33をビット展開すると 0011 0011 となります。 この0~6ビットで何を出力するかが決まります。 各ビットのそれぞれの意味は次の通りです。 0ビット:無名のプライベートマッピング (anonymous private mappings) をダンプ 1ビット:無名... [
続きを読む]
pkillコマンドで複数のプロセスを終了させる方法を紹介します。 1.問題点 Linuxで実行中のプロセスを終了させるには、killコマンドを利用することが多いと思います。 % ./a.out& % ps -ef | grep a.out | grep -v grep foo 6476 6351 0 17:44 pts/8 00:00:00 ./a.out % kill -9 6476 ただこの方法は面倒です。 pkillはプロセス名を指定して、該当プロセスを終了させるコマンドです。 % ./a.out& % pkill a.out このように、a.outのプロセス番号を調べずにa.outを強制終了させることができます。 が、複数の同名プロセスが実行されている場合、まとめて終了させる方法がわかりません。 ということで、pkillコマンドで複数のプロセスを... [
続きを読む]
Linuxコマンドラインでの省略記法を紹介します。 1.直前に実行したコマンドを再実行 直前に実行したコマンドを再実行するには、"!!"を入力します。 例: % vim foo.txt % !! で"vim foo.txt"を実行します。 2.n個前に実行したコマンドを再実行 n個前に実行したコマンドを再実行するには、"!-n"を入力します。 例: % ls -l % vim foo.txt % !-2 で2つ前の"ls -l"を実行します。 3.historyコマンドで表示されたn番目のコマンドを再実行 historyコマンドで表示されたn番目のコマンドを再実行するには、"!n"を入力します。 例: % history : 98 pwd 99 ls -l 100 cd .. 101 ls 102 pwd : % !100 で100番目の"cd ../... [
続きを読む]
lessコマンドで特定の文字列をフィルタリングする方法を紹介します。 1.問題点 あるシステムで出力されるログを、"less +F"で動的に出力しているのですが、閲覧不要なログが大量に出力され、本当に見たい内容のログが見れません。 下記のようにすると、ログが動的に出力されなくなります。 % grep -v 除外文字列 | less +F ということで、lessコマンドで特定の文字列をフィルタリングする方法を紹介します。 2.lessコマンドで特定の文字列をフィルタリングする lessコマンドで特定の文字列をフィルタリングするには、まずlessコマンドでログを表示します。 このとき、"+F"オプションは付与せずに表示させてください。 次に"&"を押下。これで下記のように"&/"が表示されます。 さらに"!"を押下すると"Non-match &/"という表示になります。... [
続きを読む]
svnでコミットログを修正する方法を紹介します。 1.問題点 svnでコミットしたファイルのコミットログを修正したいので、ネットで調べて、TortoiseSVNを使って下記の手順で変更しようとしました。 該当ファイルを右クリックして、「Show log」を選択。 (クリックで拡大、以下同様) 変更したいリビジョンを右クリックして「Edit log message」をクリック。 メッセージを修正して「OK」をクリック。 が、「Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook.」というエラーが表示されて、メッセージを修正することができません。 ということでsvnでコミットログを修正する方法を紹介します。... [
続きを読む]
subversionでファイル単位にアップデートする方法を紹介します。 1.問題点 subversionを使っているプロジェクトで特定のファイルだけをアップデートする必要が生じました。 いつもならチェックアウトしたリポジトリに移動して、 % svn update と打つのですが、これでは他のファイルもまとめてアップデートされてしまいます。 ということで、subversionでファイル単位にアップデートする方法を紹介します。 2.ファイル単位にアップデートする たいした回答ではありませんが、ファイル単位にアップデートするには、 % svn update ファイル名 と入力します。 hoge.ccのみをアップデートする場合は、下記のように入力します。 % svn update hoge.cc Updating 'hoge.cc': U hoge.cc リビジョン 3 に更新しました。... [
続きを読む]
lsコマンドでファイルのフルパスを取得する方法を紹介します。 1.問題点 lsコマンドは、カレントディレクトリまたは指定したディレクトリのファイル一覧を表示するコマンドです。 ここではカレントディレクトリのファイルを表示させています。 % pwd /home/hoge % ls -l 合計 0 -rw-r--r--. 1 root root 0 3月 26 10:56 aaa -rw-r--r--. 1 root root 0 3月 26 10:56 bbb -rw-r--r--. 1 root root 0 3月 26 10:56 ccc この表示されたファイルのフルパス、 /home/hoge/aaa /home/hoge/bbb /home/hoge/ccc を取得したいのですが、方法が分かりません。 ということで、lsコマンドでファイルのフルパスを取得する方法を紹介します。 ... [
続きを読む]
Linuxで16進数の足し算をする方法を紹介します。 1.問題点 仕事で、Linuxのシェルで下記の16進数の足し算をする必要が生じました。 35dbdf123 + 8 とりあえずコマンドライン上で16進数の足し算をしてみようと思ったのですが、方法が分かりません。 ということで、コマンドラインで16進数の足し算をする方法を紹介します。 2.コマンドラインで16進数の足し算をする コマンドラインで16進数の足し算をするには、次のようにします。 % echo "obase=16;ibase=16;35DBF123+8" | bc 35DBF12B これで目的の計算結果を得ることができました。 3.bcについて bcは、Lunuxのmanコマンド上は「任意精度の計算言語」のためのコマンドと定義されています。 ibase、obaseはbcコマンドの特殊変数で、 ibase:入力の変換基数を指定 o... [
続きを読む]
Linuxで実行中プロセスのフルパスを取得する方法を紹介します。 1.問題点 Linuxサーバをシャットダウン→再起動したあと、httpdを起動させたのですが、アクセスしたページが「Not Found」になってしまいました。 おそらくApacheが複数インストールされていて、いつも使っていないバイナリを起動させてしまったようです。 いくつかあるうちのどれかを起動すれば解消すると思います。 で、色々試しているうちに解消したのですが、結局どのhttpdが起動しているのか分からなくなりました。 psコマンドでは次のような相対パス表示なので絶対パス(フルパス)が分かりません。 # ps -ef |grep httpd root 3033 1 0 14:24 ? 00:00:00 ./httpd daemon 3034 3033 0 14:24 ? ... [
続きを読む]
C/C++によるソケット通信サンプルを紹介します。 1.はじめに Linux上で動作する、C++のソケット通信サンプルを作ってみました。 使い方は、サーバ・クライアントそれぞれのプログラムをビルドし、2つのターミナルを使ってサーバ→クライアントの順で起動すると、クライアントからサーバに簡単な文字列を送信し、サーバからクライアントにその文字をそのまま返送し、それぞれのターミナルに実行状況を表示します。 2.サーバプログラム(server.cpp) #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> int mai... [
続きを読む]
lessで文字化けする場合はlvがおすすめという記事です。 1.はじめに Linux上で、EUCのテキストファイルをlessで確認しようとしても文字化けしてみることができません。 TeraTermの設定を変更したり、Linuxの環境変数で、 export LANG=ja_JP.EUC などを設定しても事象が改善しません。 調べてみたことろ、そもそもの原因はLinuxにデフォルトでバンドルされているlessがUTF-8でしか動かない仕様になっているからのようです。 2.lvのインストール lvは、クライアントや環境設定の変更など不要で、EUC/Shift_JIS/UTF-8のテキストファイルを閲覧することができるコマンドです。 またキー操作はlessに近いので、戸惑うことなく使うことができると思います。 下記のページからrpmをダウンロード。 RPM resource lv # rpm -... [
続きを読む]
lessコマンドを"tail -f"として使う方法を紹介します。 1.はじめに tailは名前のとおり、ファイルの最後の10行を表示するコマンドです。 このコマンドに"-f"オプションをつけることで、表示したファイルが更新されて末尾行が追加されると、追加された行も表示されます。 % tail -f ファイル名 このためtailコマンドはログの監視によく使われます。 ただこのtailコマンドでファイルの前方に戻る場合、tailをCtrl-cで一旦終了させ、TeraTermなどのターミナルをスクロールし、ログ監視を再開する場合はtailコマンドを入力し直すという、ちょっと操作が面倒です。 ということで、lessコマンドを"tail -f"として使う方法を紹介します。 2.lessコマンドを"tail -f"として使う方法 lessコマンドを"tail -f"として使うには、"+F"オプションを... [
続きを読む]
nmコマンドでシンボルのサイズを調べる方法を紹介します。 1.問題点 次のサンプルプログラムを作りました。目的は配列変数a,b,cのサイズ取得です。 test.cc int main() { static int a[1000]; static int b[10000]; static int c[100]; return 0; } ビルドして実行ファイルa.outを作成します。 % g++ test.cc % ls -l 合計 16 -rwxr-xr-x 1 root root 8561 8月 31 00:18 a.out -rw-r--r-- 1 root root 102 8月 31 00:19 test.cc nmコマンドで実行ファイル指定すると、次のように表示されます。"--demangle"はシンボルをデマングルするためのオプションですが、... [
続きを読む]
yumでJavaをインストールする方法を紹介します。 1.はじめに RHELでJavaを使いたいのですが、Javaはプリインストールされていません。 JavaといえばOracle Javaですが、yumでサクッとインストールしたいところです。 ということで、yumでJavaをインストールする方法を紹介します。 2.yumでJavaをインストールする Oracle Javaではなく、オープンソースのOpenJDKであればyumでインストールすることができます。 yumリポジトリからOpenJDKを検索してみます。 # yum search openjdk 読み込んだプラグイン:product-id, search-disabled-repos, subscription-manager This system is not registered to Red Hat Subscription... [
続きを読む]
スタンドアロンのLinuxでyumを利用する方法を紹介します。 1.はじめに Linuxでyumを利用する場合、インターネット接続されている状態が普通だと思いますが、検証環境によってはインターネット接続されていないケースもあります。 yumが利用できないとRPMパッケージからのインストールか、ソースコードからのコンパイルが必要になり、面倒です。 ということで、スタンドアロンのLinuxでyumを利用する方法を紹介します。 2.スタンドアロンのLinuxでyumを利用する スタンドアロンのLinuxでyumを利用するには、メディアとして、Linuxディストリビューション(ここではRHEL)のisoファイル・イメージ(CD/DVD等)を利用します。 まず、メディア(/dev/cdrom)を(/media/redhat)にマウントします。mountコマンド実行で「~mounting read-o... [
続きを読む]
shmgetの"0x1b6"の意味について調べてみました。 1.はじめに Linuxには、共有メモリーセグメントを割り当てるshmget()というシステムコールがあります。 shmid = shmget(key, sizeof(pthread_mutex_t), IPC_CREAT | IPC_EXCL | 0x1b6); こういうサンプルをみかけるのですが、第3パラメータにある"0x1b6"の意味が分かりません。 ということで、shmgetの"0x1b6"の意味について調べてみました。 2."0x1b6"の意味 manコマンドによると、shmgetの第3パラメータはshmflgといい、動作を決めるための各フラグを設定します。 上記のサンプルにある、IPC_CREATとIPC_EXCLの意味は次のとおりです。 IPC_CREAT 新しいセグメントを作成する。このフラグが指定されなかった場合... [
続きを読む]
Linuxでコアダンプ(core)を出力する方法を紹介します。 1.問題点 Segmentation faultを発生させるC++プログラムを実行しました。 % ./a.out Segmentation fault (コアダンプ) が、ディレクトリにはcoreが出力されていませんでした。 出力されていない原因が分かりません。 ということで、coreを出力する方法を紹介します。 2.coreを出力する coreを出力するには、まずulimitコマンドで現在の設定を確認します。ulimitはシステムリソースの上限を設定するためのコマンドで"-a"オプションで設定を確認できます。 # ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling ... [
続きを読む]
Linuxで「Too many open files」というエラーになる場合の対処について紹介します。 ここではnkfコマンドを例にしていますが、他のコマンドでも適用可能です。 1.問題点 nkfで1000ファイルほどの文字コードをUTF-8に変更しようとしたところ、「Too many open files」というエラーに遭遇しました。 % nkf -w --overwrite * hoge.txt.nkftmp6vpeDo: Too many open files エラーの後、該当ファイル以降の文字コードが変換されていませんでした。 2.原因 エラーになる原因は、nkfコマンド実行時、プロセスが開けるファイルディスクリプタの上限数を超えてしまうためのようです。 3.対処 nkfではファイルディスクリプタの上限数を設定できないため、findコマンド、xargsコマンドと組み合わせて実行しま... [
続きを読む]
標準エラー出力をlessで表示する方法を紹介します。 1.問題点 LinuxでC++のビルド作業をしており、gccコマンドで数千ほどのファイルのリンケージを実行してます。 で、実行すると案の定、大量のエラーが出力され、ターミナルのスクロールバーを戻しても先頭のエラーを確認することができません。 標準出力であればパイプでつないでlessで確認できるのですが、次のようなコマンドを実行しても標準エラー出力をlessで拾えません。 % make | less ということで、標準エラー出力をlessで表示する方法を紹介します。 ここではmakeコマンドを例にしていますが、他のコマンドでもこのお作法が使えると思います。 2.標準出力と標準エラー出力の両方をlessで表示する 標準出力と標準エラー出力の両方をlessで表示するには、次のコマンドを実行します。 % make 2>&1 | l... [
続きを読む]
lessからvimやemacsに切り替える方法を紹介します。 1.はじめに lessコマンドでファイル閲覧中に"v"を押下するとviエディタに切り替わり、ファイルの編集が可能になります。 またエディタを終了するとlessに復帰するので非常に重宝しています。 ただデフォルト状態ではviしか起動せず、vimやemacsなど、他のエディタに切り替えることができません。 ということで、lessからvi以外のエディタに切り替える方法を紹介します。 2.vi以外のエディタに切り替える vi以外のエディタに切り替えるには、環境変数VISUALに"vim"を設定します。 vimの場合 % export VISUAL="vim" emacsの場合 % export VISUAL="emacs" これで"v"を押下すると、指定したエディタに切り替わります。 VISUALは、lessで"v"を押下したときの起動... [
続きを読む]
xhostコマンドで「unable to open display」となる場合の対処方法を紹介します。 1.問題点 xhostコマンドを実行すると、「unable to open display ""」というエラーになってしまいます。 # xhost + xhost: unable to open display "" ちなみにxhostはXサーバへのアクセスの許可・不許可を設定するコマンドで、"xhost +"で全てのクライアントに対してアクセス制限を解除します。 2.原因と対処 原因は、xhostを実行したターミナルで環境変数DISPLAYが設定されていないためです。 # env | grep DISPLAY # ということでxhost実行の前に、環境変数DISPLAYを設定します。 # export DISPLAY=:0.0 # env | grep DISPLAY # DISPL... [
続きを読む]
Linux 64bit環境でのC/C++ 32bitコンパイルで「-lstdc++ が見つかりません」「-lgcc_s が見つかりません」というエラーになる場合の対処方法を紹介します。 1.問題点 次のようなC/C++コードを書きました。 #include <stdio.h> void hello_world2(void) { printf( "Hello World2!\n" ); } void hello_world1(void) { printf( "Hello World1!\n" ); hello_world2(); } int main(void) { hello_world1(); return 0; } このCコードを32bitでコンパイルしたところ、下記のエラーが発生しました。 % gcc -m32 samp... [
続きを読む]
Linuxにtreeをインストールする方法を紹介します。 1.はじめに treeはディレクトリ配下のファイルやディレクトリをツリー状に表示してくれるコマンドです。 が、先日インスト―ルしたCentOSにはtreeが入っていません。 ということで、Linuxにtreeをインストールする方法を紹介します。 2.treeをインストールする yumが使える環境であれば、 # yum install tree でインストールできます。 yumが使えない場合、インストールパッケージは下記にあります。 http://rpm.pbone.net/index.php3?stat=3&search=tree&srodzaj=3 にあります。 正常にダウンロードできない場合は、リンクの「ftp://」を「http://」に書き換えて実行してみてください。 ダウンロードしたパッケージを任意のディレクトリにアップロ... [
続きを読む]
Linuxのnkfコマンドで上書きする方法を紹介します。 1.問題点 nkfはファイルの文字コードを変換するコマンドです。 たとえば、UTF-8環境のLinuxで文字コードがEUCのファイルを参照するには次のようにします。 $ nkf -w foo.txt -wはUTF-8(BOMなし)に変換するオプションです。 が、この方法ではファイルを参照するたびに毎回nkfを実行する必要があります。 できれば同じファイル名で文字コードを変更してしまいたいのですが、方法が分かりません。 2.nkfコマンドで上書きする nkfコマンドで上書きするには、 $ nkf -w --overwrite foo.txt という風に「--overwrite」を付与します。 --overwriteは既存のファイルを上書きするオプションです。 ... [
続きを読む]
mmapでMAP_FIXEDを利用する方法を紹介します。 1.はじめに mmapはファイルの内容をメモリにマップするC/C++の関数です。 mmapの引数は、 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); となっています。各引数の意味は次のとおりです。 addr:新しいマッピングの開始アドレス length:マッピングの長さ prot:マッピングのメモリ保護 flags:マッピングに対する更新の見え方 offset:マッピング開始位置 manによるとmmapは次のような動作になります。 addr が NULL の場合、カーネルがマッピングを作成するアドレスを選択する。この方法は最も移植性のある新 しいマッピングの作成方法である。 addr が NULL でない場合... [
続きを読む]
Linuxで共有ライブラリの作成とダイナミックリンクをする方法を紹介します。 1.はじめに ライブラリはリンク方法によって次の2種類に分けられます。 共有(シェアード)ライブラリ、またはダイナミックリンクライブラリ(DLL) 静的(スタティック)ライブラリ それぞれのライブラリのリンク方法も次の2種類に分けられます。 共有ライブラリをリンク:ダイナミック(動的)リンク、 静的ライブラリをリンク:スタティック(静的)リンク Linuxでは共有ライブラリを利用するのが一般的で、共有ライブラリの拡張子は.so(shared object)となっています。 ということで、Linuxで共有ライブラリの作成と、作成した共有ライブラリをダイナミックリンクで利用する方法を紹介します。 サンプルはC言語で作成します。 2.共有ライブラリ用プログラム 共有ライブラリ用プログラムとして、下記のコードを記... [
続きを読む]
yumが使えない環境でrpmファイルをインストールする方法を紹介します。 1.問題点 C++のビルドで不足している32bit用のライブラリをインストールしたいのですが、そのサーバはインターネットと接続されていません。 インストールしたいrpmファイルはネットからダウンロードして、別サーバから転送までしました。 サーバ上にあるrpmファイルをyumでインストールするには、下記のように"localinstall"を付与すればできるようですが、リポジトリの設定ができていないとダメなようです。 # yum localinstall glibc-devel-2.12-1.149.el6.i686.rpm ということで、yumが使えない環境でrpmファイルをインストールする方法を紹介します。 2.rpmファイルをインストールする サーバ上にあるrpmファイルをインストールするには、yumではなくrpm... [
続きを読む]
grepでマッチした前後の行を表示する方法を紹介します。 1.問題点 下記はPerlのプログラムから"run_callback"というメソッドをgrepコマンドで検索したところです。 % grep -r run_callback CMS/Entry.pm $app->run_callbacks( $app->run_callbacks( メソッドはマッチしますが、パラメータが改行して記述されているのですべての内容を確認することができません。 マッチした後ろの行も確認したいのですが方法がわかりません。 ということで、grepコマンドでマッチした後の行を表示する方法を紹介します。 その他、grepでマッチした前の行や前後行を同時に表示する方法もあわせて紹介します。 2.grepでマッチした後の行を表示する grepでマッチした後の行を表示するには「-A」オプ... [
続きを読む]
cpコマンドで不要なディレクトリを再帰的に除外しながらコピーする方法を紹介します。 1.問題点 次のディレクトリ構成をcpコマンドで他のディレクトリにコピーする必要が生じました。 dir1/ ├ CVS/ └ dir2/ ├ CVS/ └ dir3/ ├ CVS/ └ dir4/ : (以下同様) : お分かりのとおり、このディレクトリはCVSで管理されています。 で、このディレクトリにある「CVS」というディレクトリ(およびその配下のファイル)をすべて除外し、次のようなディレクトリ構成だけを別のディレクトリにコピーしたいのですが、方法が分かりません。 dir1/ └ dir2/ └ dir3/ └ dir4/ : (以下同様) : コピー前にCVSディレクトリ... [
続きを読む]
tarコマンドで不要なディレクトリを再帰的に除外する方法を紹介します。 1.問題点 次のようなディレクトリ構成をtarコマンドで固める必要が生じました。 dir1/ ├ CVS/ └ dir2/ ├ CVS/ └ dir3/ ├ CVS/ └ dir4/ : (以下同様) : お分かりのとおり、このディレクトリはCVSで管理されています。 で、このディレクトリにある「CVS」というディレクトリ(およびその配下のファイル)をすべて除外して、次のようなディレクトリ構成としてtarで固めたいのですが、方法が分かりません。 dir1/ └ dir2/ └ dir3/ └ dir4/ : (以下同様) : 2.不要なディレクトリを再帰的に除外する 不要なディレクトリを再帰... [
続きを読む]
Linuxのcpコマンドで"cp: omitting directory"というエラーになる場合の対処について紹介します。 この記事はLinuxビギナーの方向けの記事です。 1.問題点 Linuxのcpコマンドでfooというディレクトリを/home/hoge/aaa配下にコピーしようとしたところ、"cp: omitting directory"というエラーになりました。 $ cp ./foo /home/hoge/aaa cp: omitting directory `./foo' このエラーを解消する方法が分かりません。 2.原因と対処 ディレクトリをコピーする場合のオプションが足りません。 ディレクトリをコピーする場合、「-r」オプションが必要です。 $ cp -r ./foo /home/hoge/aaa コピー元の属性を維持する場合は「-p」オプションも併用します。 $ cp -r... [
続きを読む]
Linuxでログアウトやターミナルを切断してもコマンドを続行させる方法を紹介します。 1.問題点 TeraTermなどでLinuxサーバに接続してコマンドを実行させました。 が、実行したコマンドは終了に時間がかかり、帰宅でPCをログアウト(=ターミナル切断)しなければならないのにいつまで経っても切断できません。 ちなみにコマンドをバックグラウンドで走らせるだけでは、ターミナルの切断でバックグラウンドジョブも終了してしまいます。 ということで、ログアウトしなければならないのですがこのままコマンドを続行させる方法がわかりません。 2.ターミナルを切断してもコマンドを続行させる ターミナルを切断してもコマンドを続行させるには、bgコマンドとdisownコマンドを利用します。 foo.shという処理時間の長いスクリプトを実行させた場合、次の手順でそれぞれのコマンドを実行します。 $ foo.sh ... [
続きを読む]
Linuxでコマンドをバックグラウンドやフォアグラウンドで実行する方法のまとめです。 1.はじめに TeraTermなどのターミナルを使ってSSHでLinuxのサーバにログインして作業することがよくあります。 が、コマンドを実行している間にターミナルを終了させると、実行しているコマンドも終了してしまいます。 PCの電源を落として退社しなければならないけれども、サーバでコマンドは実行させたい場合もあると思います。 ということで、コマンドをバックグラウンドで実行する方法をまとめました。 また上記の逆で、バックグラウンドで実行しているコマンドをフォアグラウンドで実行する方法についても解説しています。 2.フォアグラウンドジョブとバックグラウンドジョブ ターミナルで実行しているコマンドのジョブは「フォアグラウンドジョブ」になります。 フォアグラウンドの場合、コマンドの実行が終了するまで次のコマンド... [
続きを読む]
シェルスクリプトでexpectを使ってログインする方法を紹介します。 1.はじめに Linuxのシェルスクリプトを作って、ルーチンワークを自動化することは多いと思います。 ただ処理の中で他のサーバにログインする場合、アカウントやパスワードを入力する必要があり、その場合どのようにスクリプトを書けばよいのかわかりません。 ということで、ここではexpectを使ってログインする方法を紹介します。 なお、OSにexpectがインストールされていない場合(=コマンドラインでexpectを実行してcommand not foundになる場合)、予めyumでインストールしてください。 yum install expect 2.expectを使ってログインする expectを使ってログインするには、次のようなスクリプトを記述します。 #!/bin/sh PASS="1234" expect -c ... [
続きを読む]
xargsで複数のコマンドを実行する方法を紹介します。 1.問題点 xargsの使い方は「Linuxでディレクトリをまとめて作成・追加する方法」で紹介したとおり、標準入力をもとに生成したコマンドラインを実行するコマンドです。 次のように入力すれば、findコマンドでみつかったディレクトリに「foo」というディレクトリをまとめて追加することができます。 % find . -type d | xargs -I{} mkdir {}/foo が、たとえば追加したディレクトリに対して、さらにchmodをしたい場合、 % find . -type d | xargs -I{} mkdir {}/foo; chmod 777 {}/foo としても期待通りの動作になりません。 2.xargsで複数のコマンドを実行する方法 xargsで複数のコマンドを実行するには、次の赤色の部分のように書き換えます。 ... [
続きを読む]
シェルスクリプトを実行するときにピリオド(ドット)をつける理由を紹介します。 1.はじめに 次のようなスクリプト(foo.sh)があるとします。 #!/bin/bash foo=123 echo $foo このスクリプトを実行するとき、コマンドラインに次のように先頭にピリオド(ドット)を単独で入力します。 [hoge@server123 ~]$ . ./foo.sh なぜ先頭にピリオドを入力するのか、意味が分かりません。 2.先頭に入力したピリオド(ドット)の意味 先頭のピリオドをつけずにスクリプトを実行した場合、新たなシェルが起動し、そこからこのスクリプトが起動され、スクリプトが終了すると起動した新たなシェルも終了します。 が、ドットコマンドでスクリプトを起動すれば、新たなシェルは起動せずカレントシェルからこのスクリプトを起動します。 何が便利かというと、たとえばスクリプトで設定した変数... [
続きを読む]
Linuxのプロンプトにフルパスを表示する方法を紹介します。 1.はじめに LinuxのサーバにTeraTermなどでログインすると、bashの場合、デフォルトで次のようなプロンプトが表示されます。 [foo@www123server ~]$ fooはユーザー、www123serverはホスト名、「~」はホームディレクトリを示します。 で、このホームディレクトリ直下に次のようなディレクトリ構成があるとします。 /home/ └ foo/ ├ test1/ │ └ abc └ test2/ └ abc これでtest1/abcというディレクトリに移動すると、プロンプトは次のように「abc」表示されます。 [foo@www123server ~]$ cd test1/abc [foo@www123server abc]$ このカレントディレクトリabcのフルパスを... [
続きを読む]
Linuxでテキストファイルの改行コードを調べる方法を紹介します。 1.はじめに LinuxでシェルやPerlなどのスクリプトを動作させる場合、改行コードがLFになっている必要があります。 たとえば、Windowsで作成した次のPerlスクリプトがあるとします。 #!/usr/bin/perl use strict; print "OK\n"; これを「test.pl」などのファイル名で保存し、そのままLinuxに転送すると改行コードがCRLFになってしまいます。 が、catコマンドでみても改行コードがLFなのかCRLFなのか分かりません。 vimで開けば次のように「^M(CR)」が表示されるのですが、できればLFも可視化してほしいです。 #!/usr/bin/perl^M use strict;^M print "OK\n";^M 2.catコマンドを利用する テキストファイルの改行コー... [
続きを読む]