maiiT
@maiiT

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Linux(Ubuntu 22.04.3 LTS)で「man」コマンドについて

解決したいこと

Linuxの動画学習をしています。動画の中で「man [」としていたので、自分もコマンドをたたいてみたら、動画のなかにある内容が自分のマニュアルにはありませんでした。
よく見たら、動画の中では「general commands」となっていて、自分のは「users commands」だったので、ネットで調べて「man 8 [」としたらエラーになりました。
試しに、「man 8 ls」「man 8 grep」などもたたいてみたのですが、同じエラーでした。
原因と、「general commands」を見る方法をご教示いただけないでしょうか。

なお、自分はWindows Terminal上でUbuntu 22.04.3 LTSを起動していて、動画内の環境はMacBookのようです。
(この情報が必要なのかわからないのですが念のため・・)

発生している問題・エラー

man 8 [
No manual entry for [ in section 8
0

2Answer

@maiiT

まず、UbuntuとmacOSは、OSが異なるのでそれぞれで提供されている [ コマンドの実装が異なります。コマンド名や基本的な機能は概ね同じですが、別のものとご理解ください (コマンド名や機能がだいたい同じなのは、POSIXという同じ規格に従うようにそれぞれ実装されているからです)。実装が異なる以上、細かい点で挙動も違いますし、提供されるmanpageも異なります。なお、Ubuntuでは、GNUプロジェクトのcoreutils実装をベースとしたものが提供されています。macOSでは、FreeBSD由来の [ コマンドをベースとしたものが提供されています。

それを踏まえたうえで、やりたいことは以下のどちらでしょうか?

A. 動画で表示されたmacOSのmanpageが見たい
B. 動画で使用されたmacOSの[コマンドに相当する、Ubuntu側のコマンドのmanpageが見たい (「general commands」と「user commands」の違いは以下で説明します)。

A の場合は、以下のページがほぼ同じものになっているはずです。
https://man.freebsd.org/cgi/man.cgi?query=test&apropos=0&sektion=0&manpath=FreeBSD+14.1-RELEASE+and+Ports&arch=default&format=html
これは、macOSのものではなく、FreeBSDの [ コマンドのmanpageですが、ほぼ同じはずです (macOSのmanpageをwebで軽く探しましたが見つけられませんでした)。動画のものと比べてみてください。内容はほぼ同じだと思います。

B の場合は、$ man [ で既に表示できている「user commands」が、まさにお探しのものです。

「general commands」と「user commands」の違いについてですが、これらは単に呼び方が違うだけで同じものを指しています。Ubuntuで「user commands」と呼んでいるものを、macOSやFreeBSDでは「general commands」と呼んでいるだけの違いです。セクション番号もともに 1 です (8ではありません。8はシステム管理者用の特殊なコマンドのセクションであり、一般的なuser/general commandsのセクションは1が該当します。上記でリンクしたFreeBSDのmanpageの始めの方に「TEST(1)」と見えると思います。括弧内の1という数字がセクション番号を示しています。なお、[コマンドとtestコマンドは基本的に同じものなので、それぞれ同じ一つのページでまとめて説明されています。ページタイトルがTESTとなっているのは、[よりもTESTの方が視認性が高いからだと思います。

1Like

Comments

  1. @maiiT

    Questioner

    @jmatsuzawa
    回答いただいたころに気づかず、お礼が遅くなり大変失礼しました。
    丁寧な解説ありがとうございます。とてもよくわかりました!
    動画では、Macで表示していた[コマンドのマニュアルをもとに解説していたので、
    「自分のと表示が違っていて、言ってる該当の記述は無いけど・・」からのはじまりだったので、
    もともとはおっしゃるところのAのつもりだったと思うのですが、
    自分で調べているうちに「同じコマンドのマニュアルのはずなのになぜ違うのだろう?」と徐々に変わっていった状況でした。
    こちらの意図も汲んで回答しようとしていただき、本当にありがとうございました!

自分の環境は、Windows11 Pro、Windows Terminal からUbuntu 22.04.3 LTSを起動しています。シェルは bash (GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu))です。
man [と打つと、↓TEST(1)のmanページが開きました。
(動画では何が開きましたか?)

scr 2024-06-24 224343.png

このページなら、man 1 TESTで開きます。

0Like

Comments

  1. @maiiT

    Questioner

    回答ありがとうございます。自分もUbuntuのバージョン以外ほぼ同じ環境と思います。
    自分も「users commands」なら出るのですが、見たいのは「general commands」です。動画も「general commands」となっていました。
    なのでセクション番号「8」を入れたのですが、エラーになってしまいました。

  2. manコマンドで見れるmanual pageのsectionの話ですね。

    manコマンドは古くからあるコマンドでUnix系のOSでは大抵備わっています。sectionに指定できる数字1~8も昔から同じです。質問者さんは1がUser commandsであると認識していて、ではGeneral commandsのセクション番号は何なのか?と思っているのだと思います。

    Linuxのmanual pageによるとsectionの定義は以下のようになっています。
    https://man7.org/linux/man-pages/man7/man-pages.7.html
    1がUser commandsですね。

    他のUnix系OS、例えばFreeBSDで見ると以下のようになっています。
    https://docs.freebsd.org/en/books/fdp-primer/manual-pages/
    1がGeneral commandsですね。

    一言で言えばUser commands=General commandsです。人によって言い方が違うだけですよ。

  3. Macでman [を打つと、↓これが出ましたが、内容は同じではないかと思います。
    OSの差ですね。

    man.png
  4. Macのman [を↓貼っておきます。

    TEST(1)                     General Commands Manual                    TEST(1)
    
    NAME
         test, [ – condition evaluation utility
    
    SYNOPSIS
         test expression
         [ expression ]
    
    DESCRIPTION
         The test utility evaluates the expression and, if it evaluates to true,
         returns a zero (true) exit status; otherwise it returns 1 (false).  If
         there is no expression, test also returns 1 (false).
    
         All operators and flags are separate arguments to the test utility.
    
         The following primaries are used to construct expression:
    
         -b file       True if file exists and is a block special file.
    
         -c file       True if file exists and is a character special file.
    
         -d file       True if file exists and is a directory.
    
         -e file       True if file exists (regardless of type).
    
         -f file       True if file exists and is a regular file.
    
         -g file       True if file exists and its set group ID flag is set.
    
         -h file       True if file exists and is a symbolic link.  This operator
                       is retained for compatibility with previous versions of
                       this program.  Do not rely on its existence; use -L
                       instead.
    
         -k file       True if file exists and its sticky bit is set.
    
         -n string     True if the length of string is nonzero.
    
         -p file       True if file is a named pipe (FIFO).
    
         -r file       True if file exists and is readable.
    
         -s file       True if file exists and has a size greater than zero.
    
         -t file_descriptor
                       True if the file whose file descriptor number is
                       file_descriptor is open and is associated with a terminal.
    
         -u file       True if file exists and its set user ID flag is set.
    
         -w file       True if file exists and is writable.  True indicates only
                       that the write flag is on.  The file is not writable on a
                       read-only file system even if this test indicates true.
    
         -x file       True if file exists and is executable.  True indicates only
                       that the execute flag is on.  If file is a directory, true
                       indicates that file can be searched.
    
         -z string     True if the length of string is zero.
    
         -L file       True if file exists and is a symbolic link.
    
         -O file       True if file exists and its owner matches the effective
                       user id of this process.
    
         -G file       True if file exists and its group matches the effective
                       group id of this process.
    
         -S file       True if file exists and is a socket.
    
         file1 -nt file2
                       True if file1 exists and is newer than file2.
    
         file1 -ot file2
                       True if file1 exists and is older than file2.
    
         file1 -ef file2
                       True if file1 and file2 exist and refer to the same file.
    
         string        True if string is not the null string.
    
         s1 = s2       True if the strings s1 and s2 are identical.
    
         s1 != s2      True if the strings s1 and s2 are not identical.
    
         s1 < s2       True if string s1 comes before s2 based on the binary value
                       of their characters.
    
         s1 > s2       True if string s1 comes after s2 based on the binary value
                       of their characters.
    
         n1 -eq n2     True if the integers n1 and n2 are algebraically equal.
    
         n1 -ne n2     True if the integers n1 and n2 are not algebraically equal.
    
         n1 -gt n2     True if the integer n1 is algebraically greater than the
                       integer n2.
    
         n1 -ge n2     True if the integer n1 is algebraically greater than or
                       equal to the integer n2.
    
         n1 -lt n2     True if the integer n1 is algebraically less than the
                       integer n2.
    
         n1 -le n2     True if the integer n1 is algebraically less than or equal
                       to the integer n2.
    
         If file is a symbolic link, test will fully dereference it and then
         evaluate the expression against the file referenced, except for the -h
         and -L primaries.
    
         These primaries can be combined with the following operators:
    
         ! expression  True if expression is false.
    
         expression1 -a expression2
                       True if both expression1 and expression2 are true.
    
         expression1 -o expression2
                       True if either expression1 or expression2 are true.
    
         ( expression )
                       True if expression is true.
    
         The -a operator has higher precedence than the -o operator.
    
         Some shells may provide a builtin test command which is similar or
         identical to this utility.  Consult the builtin(1) manual page.
    
    GRAMMAR AMBIGUITY
         The test grammar is inherently ambiguous.  In order to assure a degree of
         consistency, the cases described in the IEEE Std 1003.2 (“POSIX.2”),
         section D11.2/4.62.4, standard are evaluated consistently according to
         the rules specified in the standards document.  All other cases are
         subject to the ambiguity in the command semantics.
    
         In particular, only expressions containing -a, -o, ( or ) can be
         ambiguous.
    
    EXIT STATUS
         The test utility exits with one of the following values:
    
         0       expression evaluated to true.
    
         1       expression evaluated to false or expression was missing.
    
         >1      An error occurred.
    
    EXAMPLES
         Implement test FILE1 -nt FILE2 using only POSIX functionality:
    
               test -n "$(find -L -- FILE1 -prune -newer FILE2 2>/dev/null)"
    
         This can be modified using non-standard find(1) primaries like -newerca
         to compare other timestamps.
    
    COMPATIBILITY
         For compatibility with some other implementations, the = primary can be
         substituted with == with the same meaning.
    
    SEE ALSO
         builtin(1), expr(1), find(1), sh(1), stat(1), symlink(7)
    
    STANDARDS
         The test utility implements a superset of the IEEE Std 1003.2 (“POSIX.2”)
         specification.  The primaries <, ==, >, -ef, -nt, -ot, -G, and -O are
         extensions.
    
    HISTORY
         A test utility appeared in Version 7 AT&T UNIX.
    
    BUGS
         Both sides are always evaluated in -a and -o.  For instance, the writable
         status of file will be tested by the following command even though the
         former expression indicated false, which results in a gratuitous access
         to the file system:
               [ -z abc -a -w file ]
         To avoid this, write
               [ -z abc ] && [ -w file ]
    
    macOS 14.5                      October 5, 2016                     macOS 14.5
    
  5. @maiiT

    Questioner

    ありがとうございました!マニュアルについてよくわかっていなかったようですね。わざわざ貼り付けていただきありがとうございます

  6. 解決でよければ、当Q&Aをクローズしていただけますか。

  7. @maiiT

    Questioner

    失礼いたしました!クローズいたします。ありがとうございました

Your answer might help someone💌