web-dev-qa-db-ja.com

ファイルを作成するためのシェルコマンドがないのはなぜですか?

ご注目下さい:

私はnotをコマンドラインからファイルを作成する方法を尋ねています!


私は何年もファイルの作成にtouchを使用しており、その主な目的が他の目的であることに注意を払うことはありません。コマンドラインからファイルを作成したい場合、非常に多くの可能性があります:

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

そして、まだまだあると思います。

しかし、実際には、上記のコマンドはいずれも実際にはファイルを作成するために設計されていません。例えば、 man touchは、このコマンドがファイルのタイムスタンプを変更するためのものであることを示唆しています。 Unix(またはLinux)ほど完全なOSに、ファイルを作成するためだけに設計されたコマンドがないのはなぜですか?

28
Pouya

コマンドラインまたはシェルスクリプトでコンテンツをすぐに入力しない空のファイルを作成する必要はほとんどないためです。

最初にファイルを作成し、I/Oリダイレクションを使用してファイルに書き込むことは、1つのステップで実行できる場合はまったくメリットがありません。

本当に空のファイルを作成してそのままにしておきたい場合は、> "${file}"はより簡潔でエレガントにすることはできないと私は主張します。

TL; DR:空のファイルを作成してもほとんどの場合役に立たないため、存在しません。また、場合によっては、この目標を達成するための無数のオプションを利用できます。

補足として、touchの使用は、ファイルが存在しない場合にのみ機能しますが、リダイレクトを使用するオプションは、ファイルが存在する場合でも、常にファイルを切り捨てます(したがって、技術的には、これらのソリューションは同一ではありません)。 > fooforkを保存するため、推奨される方法です。移植性が非常に低いため、echo -nは一般的に避けてください。

39

エイドリアン・フルワースの答えは正解です。ファイルを作成するために特別に記述されたコマンドmktempがあることを追加したいと思います。

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM‐
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric‐
       tions.

確かに、mktempの仕事は特定の名前のファイルを作成することではなく、単にfileを作成することです。ただし、すでに説明したように、特定の名前でファイルを作成するためのより効率的で洗練された方法が多数あるため、そのためのコマンドを提供しても意味がありません。

そうは言っても、 truncatefallocate はどちらも重要な目的であり、ファイルを作成することを目的としています。彼らは単により洗練されたアプローチを持っています。 > fileよりも優れている方法がないため、> fileの機能を実行する単純なプログラムはありません。

16
terdon

ほとんどの基本的なシェルツールは、非常に特定の目的のための設計ではありません。ほとんどの基本的なシェルツールは設計済みであり、目的を達成するために他のユーザーと対話するためだけです。あるいは、ほとんどのツールは、目標を達成するためにどのように組み合わせるかに関わらず、非常に基本的なことを1つだけ実行すると言っておくべきでしょう。

: >./file

空のファイルが作成されます。または、既存のファイルを切り捨てます。あなたはできる:

set -o noclobber

次の場合を除いて、後者のケースの可能性を回避するため。

: >|./file

touchと同様の動作を得ることができます:

: >>./file
: >>|./file

それ以外で :は変更されていないため、ファイルのmodtimeを更新しません。

デモ

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

出力

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

触れない

: >>|./echo.file
ls -l 

出力

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file
11
mikeserv

ユーティリティinstallは、実際にはファイルを作成するために設計されています! /dev/stdinを介してファイルのコンテンツを渡すことができます(ただし、ほとんどの場合、Linuxのほとんどのフレーバーでは、/procがマウントされている必要があります)または別のソースファイルを提供します。所有権と権限を設定できます。

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

ばかげた例として。

1
Otheus