Linuxには7つのファイル形式があります。 (参照 -https://en.wikipedia.org/wiki/Unix_file_types)
- 一般ファイル
- 目次
- ブロック(バッファ)ファイル
- 文字(バッファされていない)ファイル
- パイプ(名前付きパイプ、先入れ先出し)ファイル
- ファイルまたはディレクトリへのシンボリックリンク
- ソケットファイル
(*シンボリックリンクタイプの場合、7種類すべて接続可能です。)
基本的な方法では、一般ファイルそしてファイルへのシンボリックリンクプログラムで入手して呼び出すことができます。
. regular_file_script.sh
regular_file_program
. symlink_to_regular_file_script.sh
symlink_to_regular_file_program
私が知る限り、目次そしてディレクトリへのシンボリックリンクソーススクリプトとして使用したり、プログラムとして呼び出すことはできません。
最近私は私が使用できることを発見しました。パイプラインファイルソーススクリプトとして。パイプファイルを作成し、ここにスクリプトを作成してから、他の端末からインポートできます。例は次のとおりです。
ターミナルAから:
$ mkfifo /tmp/pipe_script.sh ; echo 'echo i am a pipe_script' > /tmp/pipe_script.sh
ターミナルBから:
$ cat /tmp/test.sh
#!/bin/sh
echo sourcing a pipe script
. /tmp/pipe_script.sh
echo complete
$ /tmp/test.sh
sourcing a pipe script
i am a pipe_script
complete
しかし、私はパイプラインファイルプログラムで直接呼び出すことはできません。権限をに設定してもエラーが755
発生します。Permission denied
たとえば、
ターミナルAから:
$ mkfifo --mode 755 /tmp/pipe_program ; echo 'echo i am the pipe_program' > /tmp/pipe_program
ターミナルBから:
$ cat /tmp/test.sh
#!/bin/sh
# echo sourcing a pipe script
# . /tmp/pipe_script.sh
echo call a pipe program
/tmp/pipe_program
echo complete
$ /tmp/test.sh
call a pipe program
/tmp/test.sh: line 6: /tmp/pipe_program: Permission denied
complete
なぜ名前付きパイプファイルを取得できますが、プログラムで呼び出すことはできませんか?
全体として、この7つのタイプのうち、スクリプトで取得することができ、またはプログラムで呼び出すことができるLinuxファイルの種類は何ですか?
答え1
source
BASHが読める限り、何でも編集できます。デバイスファイルも編集できます(権限が正しい場合)。
「プログラム」はまったく異なる質問であり、通常のファイル以外にその名前を聞いたことがありません。
アプリケーションを実行するためにシンボリックリンクはほとんど使用されません。一般的なLinuxシステムには多数のアプリケーションへのハードリンクが含まれていますが、シンボリックリンクは通常共有ライブラリ用に予約されています。ハードリンクは通常のファイルと変わらず、権限を含むすべてを共有します。
答え2
他の人が言ったように、読めるものはすべてシェルから取得するか、シェルにパイプすることができます。これは他の通訳者にも当てはまります。例えばPython。
ただし、Linuxカーネルはオプションでシンボリックリンクを確認し、通常のファイルで解決されるパスのみを実行します。間接的に記録された内容です。man execve
、これはEACCES
返された場合(「許可拒否」エラーが表示されます)を示します。
このファイルまたはスクリプトソルバーは通常のファイルではありません。
execve
シンボリックリンクを解決しますが、エラーを返すように他の同様のシステムコールを設定できます。man execveat
そしてAT_SYMLINK_NOFOLLOW
。
一般ファイルの最後の明示的なチェックを見ることができます。do_open_execat
カーネルから:
/*
* may_open() has already checked for this, so it should be
* impossible to trip now. But we need to be extra cautious
* and check again at the very end too.
*/
err = -EACCES;
if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode) ||
path_noexec(&file->f_path)))
goto exit;
答え3
パイプラインを実行可能ファイルとして実行できない最も明白な理由は、ランダムアクセスをサポートしていないためです。
実行可能ファイルには以下が含まれます。
- カーネルはファイルを開き、ファイルヘッダーの数バイトを読み込みます。
- ヘッダバイトに基づいて実行可能ファイルのタイプを決定し、プログラムのさらなる処理のために正しいバイナリ形式のモジュールをディスパッチします。
- 最終的に、実行可能ファイルは、ファイルを再度開いてヘッダー全体を読み取ろうとするユーザー空間ソルバーとして扱われます。
ファイルがFIFOの場合、インタプリタはファイルを再度開いて同じ内容を読み取ることができません。読み取り用に FIFO を開くたびに会うこれは、書き込み用に FIFO を開くビルダを使用して行われます。 ㅏ新しいパイプオブジェクトを作成し、それを使用して2つのプロセス間通信を実行します。