3

先日、lsコマンドをオーバーライドすることを目的として、シェル関数を試していました。意図はls、最初のスイッチが「-y」の場合はシェルに最初に関数を呼び出させ、それ以外の場合は通常のを呼び出すこと/bin/lsでしたが、結果は私が理解できない方法で動作します。

それを有効にするために、スイッチに「-y」を使用することにしました。

$ ls -y
ls: invalid option -- 'y'
Try `ls --help' for more information.

そのため、 のコア機能を壊すことはできませんls。とにかく、問題を最も単純なものに減らし、問題を強調するのに役立つ他のいくつかの例を示します。

$ function ls() { [[ "y$1" == "y-y" ]] && echo LS ; } 
$ function less() { [[ "y$1" == "y-y" ]] && echo LESS ; }
$ function try() { [[ "y$1" == "y-y" ]] && echo TRY ; }

だから私は をオーバーライドlsし、どれが「コントロール」標本のようなものかlessを定義しています:)try

今このように呼び出す:

$ ls ; less ; try 

期待どおりに動作しますが (出力なし)、次のようになります。

$ ls -y ; less -y ; try -y
LESS
TRY

これはls機能しlessませんが、「コントロール」と同様にオーバーライドは機能します。

stackoverflow または askubuntu の他の場所 (ただし、参照を失ってしまいました)lsは、ビルトインであることを暗示する例を見ましたが、次のとおりです。

$ which ls
/bin/ls

と:

$ builtin ls
bash: builtin: ls: not a shell builtin

したがって、私のシステムにはないようです(たとえあったとしても、なぜこのように動作するのか実際にはわかりません)。

なんの説明なのかしら。重要ではありませんが、何が起こっているのかを理解したいと思います。

ありがとう。

4

3 に答える 3

6

使わないwhichで、使ってくださいtype。次のようなものがある場合

$ type ls
ls is aliased to `ls --color=auto'

次に、関数は対話型シェルで失敗します。.bashrcあなたのまたは定義されている場所でこれを削除します。ビルトインも使えますunalias

また、関数内で関数と同じ名前のコマンドを実行する場合は、再帰を避ける必要があります。

ls()
    if [[ $1 == -y ]]; then
        shift
        ...
    else
        command ls "$@"
    fi

functionまた、キーワードを使用して関数を定義する場合は、何をしているのかを確認してください。funcname() compound-commandこの記事の執筆時点で POSIX 互換性が必要な場合は、POSIXスタイルを使用してください。

于 2012-06-30T07:18:24.940 に答える
5

のエイリアスを設定するのが一般的lsです。これはあなたの場合かもしれません。テキストの単純な置換であるエイリアスが最初に処理されます。あなたの例で何が起こるかは次のとおりです。

A) `ls` is replaced with `ls --color=auto` 
B) Your `ls` function is called with the replaced text and your -y option 
C) Your function checks "$1", which is --color=auto

以下に、この動作の例を示します。

$ function ls() { [[ "y$1" == "y-y" ]] && echo LS ; }
$ ls -y
$ type ls
ls is aliased to `ls --color=auto'
$ unalias ls
$ type ls
ls is a function
ls ()
{
    [[ "y$1" == "y-y" ]] && echo LS
}
$ function ls() { [[ "y$1" == "y-y" ]] && echo LS ; }
$ ls -y
LS
$ alias ls="ls --color=auto"
$ ls -y
--color=auto -y
于 2012-06-30T07:16:23.507 に答える
1

私はそれを推測している

$ alias ls

原因を示します。

于 2012-06-30T07:17:04.363 に答える