[Linux] 必ず失敗のステータスコードを返すfalseコマンド

falseコマンドは、何も実行しません。何も実行しませんが、終了のステータスコードは必ず失敗(1)になります。
--help--versionなど、サポートされているオプションを実行し、正常に表示されても、終了コードは失敗(1)になります。
falseコマンドはGNU Coreutilsに含まれています。ここでは、falseコマンドの基本的な使い方を紹介します。
falseコマンドはシェルの組み込みコマンドにもあり、通常はシェルの組み込みコマンドの方が優先されます。
※以降の実行例は、Ubuntu17.10で確認しています。

1. 使い方

false [args]...
false option

argsには何を入力しても無視されます。

option 説明
--help ヘルプを表示します
--version バージョンを表示します

2. 実行例

シェル組み込みのfalseコマンドではなく、外部コマンドのfalseを実行するために、コマンドをフルパスで指定しています。

$ /bin/false
$ echo $?
1
$ /bin/false aaa
$ echo $?
1
$ /bin/false --version
false (GNU coreutils) 8.26
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Jim Meyering。
$ echo $?
1

終了コードは必ず’1‘になっています。

3. どのような場合に使うか?

3.1. ログインを禁止するユーザーを作成する場合

ユーザーのログインシェルに/bin/falseを指定することで、ログインできないユーザーになります。ログインシェルに/bin/falseを指定した場合、ログインに失敗しても何もメッセージは表示されませんが、終了コードは’1‘になります。
※エラーメッセージを表示させるには、/usr/sbin/nologinを指定します。

$ whoami
myuser
$ sudo useradd -m test01
$ sudo su - test01
$ whoami
test01
$ exit
ログアウト
$ sudo usermod -s /bin/false test01  #ユーザーのログインシェルを/bin/falseに変更する
$ sudo su - test01  #結果は表示されないが、ログインに失敗する
$ echo $?
1
$ whoami
myuser
$ sudo usermod -s /usr/sbin/nologin test01  #ユーザーのログインシェルを/usr/sbin/nologinに変更する
$ sudo su - test01  #エラーメッセージがでて、ログインに失敗する
This account is currently not available.
$ echo $?
1
$ whoami
myuser

3.2. スクリプトファイルを実行ファイルとして直接実行させたくない場合

スクリプトの1行目に#!で始まるシバン(shebang, シェバン)を指定すると、実行ファイルとして実行できるようになります。
はじめに、シバンにbashを指定して、直接実行できるか確かめてみます。
 
test.sh

#!/bin/bash
echo 'hoge'

シェルスクリプトを直接実行してみます。

$ chmod 755 test.sh
$ ./test.sh
hoge

正常に結果が出力されました。このシバンに/bin/falseを指定することで、直接実行することができなくなり、終了コード1を返すようになります。
 
shebang_false.sh

#!/bin/false
echo 'hoge'

シバンを/bin/falseに変更したシェルスクリプトを直接実行してみます。

$ chmod 755 shebang_false.sh
$ ./shebang_false.sh
$ echo $?
1

何も実行されず、終了コードが1となりました。
 
別のスクリプトやシェル経由であれば実行できます。

$ /bin/bash shebang_false.sh
hoge
$ echo $?
0

実行結果が出力され、終了コードも0になりました。

3.3. コマンドやスクリプトの実行失敗をわざと作り出す場合

ジョブ監視システムやスクリプトで、わざと失敗した状態を作りたい場合にも利用できます。

  • ジョブ失敗時の状態を確認するために、コマンドに/bin/falseを指定してみる。
  • コマンドの成功した場合も失敗としたい場合、 command && /bin/false を指定してみる。

 
以上、必ず失敗のステータスコードを返すfalseコマンドの紹介でした。