Bashが関数で使用されたlsコマンドに--color = autoを自動的に挿入するのはなぜですか?

Bashが関数で使用されたlsコマンドに--color = autoを自動的に挿入するのはなぜですか?

私はこのsetupファイルを持っています:

function latest { 
    count=${1:-5} ; 
    echo "Just changed"
    ls -lrtd * | tail -$count ; 
}

私はそれをそう呼ぶ:

. setup

latest次にbashに関数が定義されているかどうかを尋ねます。

>type latest
latest is a function
latest () 
{ 
    count=${1:-5};
    echo "Just changed";
    ls --color=auto -lrtd * | tail -$count
}

Just changedlatest他のファイルの定義を見ていないことを確認するために使用する任意の文字列です。

問題はBashが--color=autoコマンドに追加する理由ですls(とにかく出力がパイプで接続されているので役に立ちません)。はい、私のシェルでは、エイリアスはlsですls --color=auto。エイリアスを削除すると、これは発生しません。しかし、関数内ではエイリアスは使用されていないと思いますが、どのような場合でも関数定義時にこれらの置換が発生しますか?

答え1

文書化された動作を観察します。Bash マニュアルのエイリアスセクション:

エイリアスは、関数定義自体がコマンドであるため、関数が実行されるのではなく、関数定義を読み取るときに拡張されます。

答え2

上記のジェフは正しいです。シェルで定義されたエイリアスを表示するには、プロンプトで「alias」と入力します。

例:

[USERID ~] $ alias
alias l.='ls -d .* --color=auto'
alias ll='ls -ahlF'
alias ls='ls --color=auto'
alias vi='vim'
[USERID ~] $

スクリプトでエイリアスを回避するには、「ls」コマンドのエイリアスを解放するか、直接呼び出す必要があります。 "ls"の場所を見つけるには、組み込みのシェルタイプを使用してください。

[USERID ~] $ type -P ls
/usr/bin/ls

変数に入れて、その変数として "ls"を呼び出すことができます。

[USERID ~] $ lsCmd=$(type -P ls)
[USERID ~] $ echo $lsCmd
/usr/bin/ls
[USERID ~] $ ls
MyAppData  MyDocuments  MyDownloads  Scripts  tmp.VOOlcGffwf  tmp.Y6IE7S2ps4
[USERID ~] $ $lsCmd
MyAppData  MyDocuments  MyDownloads  Scripts  tmp.VOOlcGffwf  tmp.Y6IE7S2ps4

最初のケースでは、「ls」を呼び出すと、「ls」のエイリアスが「ls --color = auto」なので、色付きの出力が提供されますが、2番目の場合はエイリアスがBypassなので、色のない出力が提供されます。

答え3

Bashがエイリアスを拡張する理由と時期を説明するために、以前の答えはすべて正確です。ただし、特定のディレクトリのリストを画面で読み取れないほど色が似ているようにする(面倒な)ls-エイリアスを削除する場合は、削除するエイリアスの定義は/ etc / skel /ファイルにあります。 .bashrc

関連情報