私はいくつかのシェルが、少なくともファイル名がシンボリックリンクを命名する場合を検出するためにファイルテスト演算子をサポートしていることを知っています。
POSIXはありますか?便利1同じ機能を提供しますか?
1ここでは正しい用語を使用していない可能性があります。 「ユーティリティ」とは組み込みシェルではなく、/bin
etc.以下のスタンドアロン実行可能ファイルを意味します。/usr/bin
答え1
あなたが探しているtest
:
-h パス名
パス名が存在し、シンボリックリンクであるファイルで解決された場合は真です。パス名が解決できない場合、またはパス名が存在するがシンボリックリンクではないファイルで解決された場合は、False を返します。パス名の最後のコンポーネントがシンボリックリンクの場合、シンボリックリンクに従わないでください。
ほとんどのシェルには組み込みプログラムがありますが、test
途中でシェルを呼び出さずに他のプログラムから呼び出すことができるスタンドアロンプログラムとしても存在します。これは、シェル自体で機能する機能(break
、、、 ...などの特殊な組み込み機能export
)set
を除いて、シェルに存在できるほとんどの組み込み機能に当てはまります。
[ -h pathname ]
Equivalenttest -h pathname
は[
まったく同じように機能しますtest
が、[
最後に追加のパラメータが必要です。のようにスタンドアロンプログラムとして存在します。]
[
test
たとえば、
$ ln -s foo bar
$ /usr/bin/test -h bar && echo y
y
答え2
2つのユーティリティがこれを実行できfile
ますreadlink
。
file some_symlink
表示されますsome_symlink: symbolic link to 'some_target'
readlink some_symlink
コード 0 で終了し、readlink some_file
コード 1 で終了します。
気づく終了コード変数に保存して$?
表示できますecho $?
。
答え3
さらにstat
:
$ touch test
$ ln -s test test_l
$ stat test
File: `test'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fc00h/64512d Inode: 4309 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ vagrant) Gid: ( 1000/ vagrant)
Access: 2015-09-11 11:37:59.864165922 +0000
Modify: 2015-09-11 11:37:59.864165922 +0000
Change: 2015-09-11 11:37:59.864165922 +0000
Birth: -
$ stat test_l
File: `test_l' -> `test'
Size: 4 Blocks: 0 IO Block: 4096 symbolic link
Device: fc00h/64512d Inode: 7179 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/ vagrant) Gid: ( 1000/ vagrant)
Access: 2015-09-11 11:38:07.220173955 +0000
Modify: 2015-09-11 11:38:07.220173955 +0000
Change: 2015-09-11 11:38:07.220173955 +0000
Birth: -
$ stat -c "%F" test
regular empty file
$ stat -c "%F" test_l
symbolic link
答え4
あるいは、単純なスクリプトを使用することもできます。
#!/bin/bash
ls -alFQ | grep '^l'
Unixの鍵は、複雑なタスクを実行するために互いに接続できる小さなシンプルなユーティリティを持つことです。したがって、これは技術的にPOSIXユーティリティではありませんが、ほぼPOSIXユーティリティに近いです。
もっとクールにしたい場合は、返す文字列部分のみを選択できます。
#!/bin/bash
ls -alFQ | grep '^l' | tr -s ' ' | cut -d ' ' -f 11
-f 11
リンクが指すファイルを返し、-f 10
リンクの名前を返します。これはファイル名にスペースが含まれていない場合にのみ機能します。それ以外の場合はトリッキーになります。おそらく完了することができますが、空白を離れるか、パターンを使用する必要があります。これは私が今書いたい以上の作業です。 。
0/1を返したい場合:
#!/bin/bash
if [[ -n $(ls -alFQ | grep '^l') ]]; then
exit
else
exit 1
fi