b.l0g.jp     About     Archive     Feed

CentOSで各種ビープ音を鳴らさないようにする

<ログイン時>

Xを起動するようにしていると(ランレベル5)、ログイン画面表示時にビープ音が鳴る。

「システム(System)」→「管理(Administration)」→「ログイン画面(Login Screen)」から「アクセシビリティ(Accessibility)」タブを開き、「ログイン画面を表示した時」のチェックを外す。

ログアウトし、次にログイン画面が表示されるときには、ビープ音は鳴らないようになっているはず。

<ターミナル使用時>

ターミナルを使用している時にタブを使ったりすると、ビープ音が鳴ることがある。

/etc/inputrc に以下の行を追加する(コメントアウトされた状態で既に記述があるはず)


set bell-style none

ログインしなおすと、設定が有効になりビープ音は鳴らなくなる。

<vi>

vi(vim)を使用していると、コマンドを間違えた時などにビープ音が鳴る。

viの設定ファイル(ホームディレクトリの.vimrcや/etc/skel/.vimrcなど)に以下の行を追加する。


set visualbell

記述してからviを起動すると、ビープ音は鳴らなくなる。

<全部のビープ音を鳴らないようにする>

ビープ音は、pcspkrというモジュールを経由して、マザーボード上のスピーカを動かして鳴らしている。このモジュール自体をロードしないようにしてしまえば、ビープ音は鳴らない。

/etc/modprobe.d/blacklist ファイルに以下の行を追加する。


blacklist pcspkr

<VMware Playerを使用している場合>

VMware Playerを使用している時には、ゲストOSでビープ音が鳴るタイミングで、VMware Playerを通じて、ホストマシンのビープ音が鳴ってしまう。これを鳴らさないようにするには、VMware側の設定でビープを無効にしてしまう。

C:\Users(ユーザ名)\AppData\Roaming\VMware\preferences.ini ファイルと、対象になる仮想マシンの設定ファイル(.vmx)に以下の行を追加する。


mks.noBeep = "TRUE"

出典 : VMwareのKnowledge base

<Windowsでビープ音を鳴らさないようにする>

ついでにWindowsの場合も。ビープ音を鳴らすドライバを無効にしてしまう。以下、Windows 7での例。

  1. コントロールパネルなどから「デバイスマネージャ」を起動
  2.  「表示」→「非表示のデバイスの表示」
  3. ツリーから「プラグアンドプレイではないドライバ」→「Beep」を右クリックし、プロパティ
  4.  「ドライバー」タブで「停止」を選択

以上

bshでのクォーテーションの入れ子

特殊文字(?など)をそのまま文字として扱いたい場合などに、シングルクォーテーション(‘)やダブルクォーテーション(“)で文字をくくる。

  • 「”」でくくった文字列は、その中に特殊文字が含まれているならそれを展開する。
  • 「’」でくくった文字列は、その中に特殊文字が含まれていてもそれを展開せず、そのまま表示する。
  
[hoge@symf test]$ abc=3
    
↑ abcという変数に3を代入
  
[hoge@symf test]$ echo $abc
  
3
    
↑ abcという変数の中身を表示
  
[hoge@symf test]$ echo "$abc"
  
3
    
↑ 「"」は特殊文字を展開するので変数として扱われるので、上に同じ
  
[hoge@symf test]$ echo '$abc'
  
$abc
    
↑ 「'」は特殊文字をそのまま表示する
  

クォーテーションを入れ子にする際には、シングルとダブルで少しやり方が違う。「man bash」の「クォート」の項には以下のように書かれている。

シングルクォートで文字を囲むと、クォート内部のそれぞれの文字は文字としての値を 保持 します。シングルクォートの間にシングルクォートを置くことはできません。これはバックスラッシュを前に付けても同じです。

ダブルクォートで文字を囲むとクォート内部の全ての文字は文字としての値を保持しま すが、 $, ‘, \ は例外となります。 $ と ‘ はダブルクォートの内部でも特殊な意味を失いません。バックスラッシュの場合は、次の文字が $, ‘, “, \,のいずれかである 場合に限り特殊な意味を失いません。前にバックスラッシュを付ければ、ダブルクォート文字をダブルクォートによるクォートの内部でクォートできます。

つまりこういうこと。

  
[hoge@symf test]$ ssh server "psql -c \"create database test with ENCODING = 'UTF8' ;\" "
    
↑ 「"」の中に「\"」があるので、これは成功

[hoge@symf test]$ ssh server 'psql -c \"create database test with ENCODING = 'UTF8' ;\" '
    
↑ 「'」の中では「\」をつけてもダメなので、これは失敗
  

create databaseじゃなくてcreatedbを使えば、クォートを入れ子にしなくてもいいって?あくまで例ですから (`・ω・´)キリッ

shのwhileループでファイルを読み、中でsshを実行すると1回しかループしない

シェル(sh)スクリプトネタ。

while 文で以下のように指定すると、行ごとにファイルを読み込むことができる。

  
#!/bin/sh

\# ファイルを1行ずつ読み込んで表示

TESTFILE=./hoge.txt

while read line
  
do
      
echo $line
  
done < $TESTFILE
  

しかし、 while ループの中で ssh や rsh を実行すると、読み込むファイルが複数行あっても、1行目しか処理されない。

  
#!/bin/sh

\# TESTFILEが複数行あっても1行目のみ処理されてループ終了

while read line
  
do
      
ssh 192.168.0.1 touch $line
  
done < $TESTFILE
  

SSH を実行すると、標準入力がそちらに振り向けられるため、read で読んだ1行のみならず、ファイル全体が SSH に渡されてしまう。従って、SSH を実行した後はもう読める行がないので while ループは1回で終了してしまう。

これを防ぐには、ssh に -n オプションを付け、/dev/null をリダイレクトし、標準入力をリダイレクトしないようにする。

  
#!/bin/sh

\# TESTFILEが複数行あればその行数分処理が実行される

while read line
  
do
      
ssh -n 192.168.0.1 touch $line
  
done < $TESTFILE
  

なおこれは rsh コマンドでも同じ仕様になっているようだ。

なぜ1行目だけで終わってしまうのか分からずうんうんうなってたら、この本に書いてあった。