95176


C言語でファイル処理を使ったコードを作成しています。ファイル名はコマンドライン引数に指定するのでterminal-1な感じで指定するのですが、これを実行するとterminal-2のような結果になって実行できません。どうすればいいのでしょうか。

terminal-1

[code]

    test number t.txt my.txt
    
[/code]

terminal-2

[code]

    bash: test: t.txt: 二項演算子が予期されます
    
[/code]

わかっていること

  * コンパイル時にエラーはない
  * コマンドライン引数の数を減らす(減らさなくても)と最後から2番目の数に発生する
  * 拡張子がなくとも発生する


CC BY-SA 4.0
2023-06-11T01:17:00.713
95174
2023-06-11T01:44:44.203
2023-06-11T01:36:13.523
4236
56895
question
linux bash shell
実行時に「二項演算子が予期されます」と表示される


[Bashビルトインコマンド`type`](https://www.gnu.org/software/bash/manual/bash.html#index-
type) を実行するとわかりますが

[code]

    $ type test
    test is a shell builtin
    
[/code]

と出力され、単に`test`という名前のコマンドを実行しようとした場合は[シェルビルトインコマンド`test`](https://www.gnu.org/software/bash/manual/bash.html#index-
test)が実行されます。そのため、質問者さんが作成した外部コマンドはそもそも実行されていません。

* * *

ではどうすればいいかですが、混乱の元ですので、実行ファイル名をビルトインコマンドと同名にすることは止めるべきです。`cd`とか`pwd`とか`exit`とかなども避けるべきです。

それでも`test`という名称を使いたい場合は、実行の際パスを指定しましょう。ビルトインコマンドにはパスが存在しないので一致せず確実に外部コマンドが呼び出されます。  
雑な回避策としてコマンドの手前に`env`と付けることも有効です。`env`コマンドの仕様上、確実に外部コマンドが呼び出されます。


CC BY-SA 4.0
2023-06-11T01:35:44.483
95175
2023-06-11T01:35:44.483
4236
95174
answer


ほとんどのLinuxには標準で`test`という実行ファイル(`/usr/bin/test`)が存在し、また、bashには`test`という組み込みコマンドが存在します。そのため、

  * bashのシェル上で単に`test`を実行しようとした場合、bashの組み込みコマンドである`bash`が実行される。(組み込みコマンド`test`の詳細は`man bash`で確認できます。zsh等の組み込みコマンド`test`がある場合も同じ動作ですが、zshでの詳細は`man zshbuiltins`で確認できます。)
  * bash以外のシェル(tcshとか)で単に`test`を実行しようとした場合、環境変数`PATH`(`echo $PATH`で確認できます)に列挙されたディレクトリから`test`という名前の実行ファイルを検索し、最初に引っかかった実行ファイルを実行する。標準的なLinux環境では、実行ファイル`/usr/bin/test`が実行される。(実行ファイル`/usr/bin/test`の詳細は`man test`で確認できます。)

エラーメッセージからbash組み込みコマンド`test`が実行しようとして、引数が間違っているため失敗したようです。

このように「ファイル名」で実行しようとすると、組み込みコマンド→環境変数`PATH`の順でコマンドまたは実行ファイルが検索されます。通常、環境変数`PATH`にはカレントディレクトリ(`.`)は含まれていないので、カレントディレクトリにある実行ファイルが実行されることはありません。

自分で作成した実行ファイルを実行したい場合は、「ファイル名」ではなく、何らかのディレクトリのパスが含まれた相対または、絶対パスを付けてください。

カレントディレクトリにある場合

[code]

    ./test number t.txt my.txt
    
[/code]

`/path/to/proj`というディレクトリにある場合

[code]

    /path/to/proj/test number t.txt my.txt
    
[/code]


CC BY-SA 4.0
2023-06-11T01:36:09.363
95176
2023-06-11T01:44:44.203
2023-06-11T01:44:44.203
7347
7347
95174
answer