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


27

ご注目ください:

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


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

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

そして、もっとあると確信しています。

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


35
すでに存在するツールで何十もの方法で実行できるコマンドを追加するためにシステムを混乱させるのはなぜですか?
マイケルコーン14

4
ストリーム/ stdin / outからファイルを読み取るためのコマンドがないのはなぜですか?全員が、catconnation 向けのコマンドを使用します!
SF。

2
@マイケル・コーン このアプローチでは、システムを混乱させるだけのコマンドが多数あります。なぜ使用moreするときは、less何よりも多くいmoreませんが!またはdirls。とはいえ、互換性の問題は承知しています。
ポウヤ14

9
moreの作成より前lesslessの欠点に対処するために特別に作成されましたmoremore下位互換性の理由からまだ存在します。dirそしてls、ほとんどの意図と目的のために、同じ実行可能ファイルです-それらはほんの数バイトで異なります。ファイルの作成専用の新しいツールは、既存のツールよりも機能が少ないため、lessvs の場合のような改善ではなく、リグレッションになりますmore
lanzz 14

1
さらに、レガシーを調べる必要があります。Unixは各バイトがカウントされたときに作成されました。既存のユーティリティで実行できるタスク用のユーティリティを作成する理由
トーマス14

回答:


38

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

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

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

TL; DR:ほとんどの場合、空のファイルを作成しても意味がありません。存在する場合は、この目標を達成するためのさまざまなオプションが既に用意されています。

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


1
ファイルを作成してからI / Oツールを使用することについて、非常に堅実な点を見つけました。ありがとうございました。
ポウヤ14

1
@FaheemMithaはい(>>)。私はOPを使用して与えられた例を参照していました>。ファイルを作成する場合(または存在する場合はNOOPを使用する場合)は、追加してもまったく役に立ちません。
エイドリアン・フリューワート14

1
既存のファイルを上書きするnoclobberように設定する必要がないことを忘れないでください>
Ouki 14

1
@Ouki私の知る限り、デフォルトの動作ではありません、もう1つは潜在的に作成するのと同じ方法で、トラブルにつながる、それが一つのシステム上で設定していない他の人のことを忘れることができる設定alias rm='rm -i'の代わりにすることはalias rmi='rm -i'悪い考えです。
アギハマーシーフ14

1
@mikeservは> .file、コマンドラインのみで、:
チャールズダフィー14

16

エイドリアン・フリューワースの答えは正解です。ファイルを作成するために特別に作成されたコマンドが実際にあることを付け加えました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の仕事は特定の名前でファイルを作成することではなく、単にファイルを作成することです。ただし、既に説明したように、指定された名前のファイルを作成するより効率的でエレガントな方法は非常に多くあり、そのためのコマンドを提供しても意味がありません。

言った、あなたはまた、持っているtruncatefallocateの両方を持つ本質的な目的のファイルを作成することです。彼らは単により洗練されたアプローチを持っています。> fileそれより良い方法がないので、することをする単純なプログラムは決してありません> file


11

ほとんどの基本的なシェルツールは、非常に特定の目的のためにはまったく設計されていません。ほとんどの基本的なシェルツールは、目的を達成するために他のユーザーと対話するためだけに設計されています。あるいは、目標を達成するためにどのように組み合わせるかには関係なく、ほとんどのツールは非常に基本的なことを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

デフォルトでは、エコーは\n行の最後に追加されます。echo -n >echo-n.file(サイズ= 0)とecho -e >echo-e.file(サイズ= 1)を試す
トーマス14

@Thomas '標準出力に書き込まれる文字列。最初のオペランドが-nの場合、またはいずれかのオペランドにバックスラッシュ( '\')文字が含まれている場合、結果は実装定義です。XSI準拠のシステムでは、最初のオペランドが-nの場合、オプションではなく文字列として扱われます。次の文字シーケンスは、XSI準拠システムで引数のいずれかで認識されます... ' pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html
mikeserv

結構です、リンクをありがとう、とにかく私のコメントはポイントではありません
トーマス14

2
はい、確かに申し訳ありませんが、とにかくあなたの答えのポイントが私のコメントに欠けていたことを意味します。
トーマス14

1
UNIXが一般化する傾向の例は、ファイルの内容を表示するコマンドが呼び出されるという事実ですcat。1つのコマンドで複数のファイルを標準出力に連結できるのに、1つのファイルを表示するコマンドがあるのはなぜですか?
200_success 14

1

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

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

愚かな例として。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.