ファイル名がシンボリックリンクかどうかをテストするためにPOSIXユーティリティを探しています。

ファイル名がシンボリックリンクかどうかをテストするためにPOSIXユーティリティを探しています。

私はいくつかのシェルが、少なくともファイル名がシンボリックリンクを命名する場合を検出するためにファイルテスト演算子をサポートしていることを知っています。

POSIXはありますか?便利1同じ機能を提供しますか?


1ここでは正しい用語を使用していない可能性があります。 「ユーティリティ」とは組み込みシェルではなく、/binetc.以下のスタンドアロン実行可能ファイルを意味します。/usr/bin

答え1

あなたが探しているtest:

-h パス名

パス名が存在し、シンボリックリンクであるファイルで解決された場合は真です。パス名が解決できない場合、またはパス名が存在するがシンボリックリンクではないファイルで解決された場合は、False を返します。パス名の最後のコンポーネントがシンボリックリンクの場合、シンボリックリンクに従わないでください。

ほとんどのシェルには組み込みプログラムがありますが、test途中でシェルを呼び出さずに他のプログラムから呼び出すことができるスタンドアロンプ​​ログラムとしても存在します。これは、シェル自体で機能する機能(break、、、 ...などの特殊な組み込み機能exportsetを除いて、シェルに存在できるほとんどの組み込み機能に当てはまります。

[ -h pathname ]Equivalenttest -h pathname[まったく同じように機能しますtestが、[最後に追加のパラメータが必要です。のようにスタンドアロンプ​​ログラムとして存在します。][test

たとえば、

$ ln -s foo bar
$ /usr/bin/test -h bar && echo y
y

答え2

2つのユーティリティがこれを実行できfileますreadlink

  1. file some_symlink表示されますsome_symlink: symbolic link to 'some_target'
  2. 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

関連情報