Last Update 2022/09/03
リダイレクト
テスト項目
(01) 入力・出力のリダイレクト
(02) リダイレクト出力の追加
(03) 標準出力と標準エラー出力のリダイレクト
(04) ヒアドキュメント
(05) ヒアストリング
サンプルコード
sample.c
sample.c
#include <stdio.h>
int main(int argc, char *argv[])
{
char buf[100];
if (argc > 1)
{
/* 引数有りの場合、引数の文字列を標準出力と標準エラーへ出力 */
fprintf(stdout, "argv-->stdout --- %s\n", argv[1]);
fprintf(stderr, "argv-->stderr --- %s\n", argv[1]);
}
else
{
/* 引数無しの場合、標準入力の入力値を標準出力と標準エラーへ出力 */
fgets(buf, 100, stdin);
fprintf(stdout, "stdin-->stdout --- %s\n", buf);
fprintf(stderr, "stdin-->stderr --- %s\n", buf);
}
return 0;
}
実行結果
$ ./a.out sample_string <--- サンプルコードをリダイレクト無しで実行
argv-->stdout --- sample_string
argv-->stderr --- sample_string
$ ./a.out sample_string > sample1.txt <--- 出力リダイレクトを使用して実行
argv-->stderr --- sample_string
$ cat sample1.txt
argv-->stdout --- sample_string <--- 標準出力への出力は指定ファイルへ出力される
$ ./a.out < sample1.txt <--- 入力リダイレクトを使用して実行
stdin-->stdout --- argv-->stdout --- sample_string <--- sample1.txtの文字列が入力値となる
stdin-->stderr --- argv-->stdout --- sample_string
実行結果
$ ls /usr > sample1.txt <--- sample1.txtへのリダイレクト(書き込み)
$ cat sample1.txt
bin <--- sample1.txtへ新規の書き込み
include
lib
libexec
local
sbin
share
src
$ ls /var >> sample1.txt <--- sample1.txtへのリダイレクト(追加)
$ cat sample1.txt
bin
include
lib
libexec
local
sbin
share
src
cache <--- 以降が追加出力
db
lib
local
lock
log
mail
opt
run
spool
tmp
サンプルコード
sample.c
sample.c
#include <stdio.h>
int main(int argc, char *argv[])
{
char buf[100];
if (argc > 1)
{
/* 引数有りの場合、引数の文字列を標準出力と標準エラーへ出力 */
fprintf(stdout, "argv-->stdout --- %s\n", argv[1]);
fprintf(stderr, "argv-->stderr --- %s\n", argv[1]);
}
else
{
/* 引数無しの場合、標準入力の入力値を標準出力と標準エラーへ出力 */
fgets(buf, 100, stdin);
fprintf(stdout, "stdin-->stdout --- %s\n", buf);
fprintf(stderr, "stdin-->stderr --- %s\n", buf);
}
return 0;
}
実行結果
$ ./a.out sample_string <--- サンプルコードをリダイレクト無しで実行
argv-->stdout --- sample_string
argv-->stderr --- sample_string
$ ./a.out sample_string &> sample1.txt <--- 「&>」で標準出力と標準エラー出力をsample1.txtへリダイレクト
$ cat sample1.txt
argv-->stderr --- sample_string
argv-->stdout --- sample_string
$ ./a.out sample_string >& sample2.txt <--- 「>&」で標準出力と標準エラー出力をsample2.txtへリダイレクト
$ cat sample2.txt
argv-->stderr --- sample_string
argv-->stdout --- sample_string
$ ./a.out sample_string > sample3.txt 2>&1 <--- 「2>&1」で標準出力と標準エラー出力をsample3.txtへリダイレクト
$ cat sample3.txt
argv-->stderr --- sample_string
argv-->stdout --- sample_string
サンプルコード
sample.c
sample.c
#include <stdio.h>
int main(void)
{
char buf[1000];
while (fgets(buf, 1000, stdin) != NULL)
{
/* 標準入力から読み取った文字列に、接頭辞を付加して出力 */
printf("stdin--> %s", buf);
}
printf("\n");
return 0;
}
実行結果(1)
$ ./a.out << "EOF" <--- 「<<」以降の引用符を除去した「EOF」が区切り文字となる
> sample string <--- ここからヒアドキュメント
> line 1
> line 2
> EOF <--- 区切り文字「EOF」で終了
stdin--> sample string <--- ヒアドキュメントが標準入力から入力されコードが実行される
stdin--> line 1
stdin--> line 2
実行結果(2)
$ SAMPLE1="SAMPLE" <--- シェル変数の設定
$ ./a.out << "EOF" <--- 引用符付きの区切り文字指定
> $SAMPLE1
> EOF
stdin--> $SAMPLE1 <--- 変数は展開されない
$ ./a.out << EOF <--- 引用符無しの区切り文字指定
> $SAMPLE1
> EOF
stdin--> SAMPLE <--- 変数が展開される
実行結果
「(04)ヒアドキュメント」でのサンプルコードを使用
「(04)ヒアドキュメント」でのサンプルコードを使用
$ ./a.out <<< sample
stdin--> sample <--- 文字列「sample」が標準入力へ提供される
$ ./a.out <<< $(ls /usr)
stdin--> bin <--- コマンド展開の結果が標準入力へ提供される
stdin--> include
stdin--> lib
stdin--> libexec
stdin--> local
stdin--> sbin
stdin--> share
stdin--> src
ヒアストリングでは展開が実行される
実行環境
GNU bash, version 5.1.16
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。