$COLUMNSがenvまたはsetとしてリストされていないのはなぜですか? (zshから)

$COLUMNSがenvまたはsetとしてリストされていないのはなぜですか? (zshから)

私はできます。

$ echo $COLUMNS
95

結果を得るが、もし私が

env | grep COLUMNS

または

set | grep COLUMNS

私は何も得られませんでした。

(更新:ちょうどbashで動作が異なることがわかりました。私はzshを使用しています。)

第二に、列を含むリストをどのように/どこで取得できますか? (直接回答することは除く。)

答え1

set | grep COLUMNS「バイナリファイル(標準入力)の一致」を表示する必要があります(GNU grepを使用)。ムル犯人は正しく識別されました。 zsh では、IFS標準文字のスペース、タブ、改行に加えて null バイトも含まれています。

set | grep --text COLUMNSgrepがバイナリファイルをスキップする傾向を無視するように実行します。

runはset多くのシェルで出力があいまいであるため、現在設定されているパラメータを一覧表示する移植可能で信頼できる方法ではありません(変数の値の一部である改行文字と変数を区切る改行文字を区別できません)。 zshsetの出力はあいまいにならないように引用されていますが、解析するのは難しいです。grep偽の肯定がまだ返されることがあります。 zshのすべてのパラメータを一覧表示するには、配列のキーを列挙しますparameters

print -rl ${(ko)parameters}

答え2

推測しなければならないと疑うだろう。IFS。またsetリストされていますIFS。私にとって、IFSそれは(スペース、水平タブ、改行、nul)でした。

$ printf "%s" "$IFS" | od -a
0000000  sp  ht  nl nul
0000004

\0NUL文字()がある場合はgrepバイナリとして扱われるため、ユーザーによっては次のようにgrep表示されることがあります。

$ set | grep COLUMNS        
Binary file (standard input) matches

grep入力がテキストとして処理されるように強制できます。

-a, --text
    Process a binary file as if it were text; this is equivalent 
    to the --binary-files=text option.

だから:

$ set | grep COLUMNS --text
COLUMNS=239

関連情報