私はnotをコマンドラインからファイルを作成する方法を尋ねています!
私は何年もファイルの作成にtouch
を使用しており、その主な目的が他の目的であることに注意を払うことはありません。コマンドラインからファイルを作成したい場合、非常に多くの可能性があります:
touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar
そして、まだまだあると思います。
しかし、実際には、上記のコマンドはいずれも実際にはファイルを作成するために設計されていません。例えば、 man touch
は、このコマンドがファイルのタイムスタンプを変更するためのものであることを示唆しています。 Unix(またはLinux)ほど完全なOSに、ファイルを作成するためだけに設計されたコマンドがないのはなぜですか?
コマンドラインまたはシェルスクリプトでコンテンツをすぐに入力しない空のファイルを作成する必要はほとんどないためです。
最初にファイルを作成し、I/Oリダイレクションを使用してファイルに書き込むことは、1つのステップで実行できる場合はまったくメリットがありません。
本当に空のファイルを作成してそのままにしておきたい場合は、> "${file}"
はより簡潔でエレガントにすることはできないと私は主張します。
TL; DR:空のファイルを作成してもほとんどの場合役に立たないため、存在しません。また、場合によっては、この目標を達成するための無数のオプションを利用できます。
補足として、touch
の使用は、ファイルが存在しない場合にのみ機能しますが、リダイレクトを使用するオプションは、ファイルが存在する場合でも、常にファイルを切り捨てます(したがって、技術的には、これらのソリューションは同一ではありません)。 > foo
はfork
を保存するため、推奨される方法です。移植性が非常に低いため、echo -n
は一般的に避けてください。
エイドリアン・フルワースの答えは正解です。ファイルを作成するために特別に記述されたコマンド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を作成することです。ただし、すでに説明したように、特定の名前でファイルを作成するためのより効率的で洗練された方法が多数あるため、そのためのコマンドを提供しても意味がありません。
そうは言っても、 truncate
と fallocate
はどちらも重要な目的であり、ファイルを作成することを目的としています。彼らは単により洗練されたアプローチを持っています。 > file
よりも優れている方法がないため、> file
の機能を実行する単純なプログラムはありません。
ほとんどの基本的なシェルツールは、非常に特定の目的のための設計ではありません。ほとんどの基本的なシェルツールは設計済みであり、目的を達成するために他のユーザーと対話するためだけです。あるいは、ほとんどのツールは、目標を達成するためにどのように組み合わせるかに関わらず、非常に基本的なことを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
ユーティリティinstall
は、実際にはファイルを作成するために設計されています! /dev/stdin
を介してファイルのコンテンツを渡すことができます(ただし、ほとんどの場合、Linuxのほとんどのフレーバーでは、/proc
がマウントされている必要があります)または別のソースファイルを提供します。所有権と権限を設定できます。
echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html
ばかげた例として。