3

ls が bash または python スクリプトで作成するのと同じ出力が必要です。ディレクトリを一覧表示するという意味ではありませんが、「ループ可能」にするために ls が行うことです。例:

# ls
a b c d

# ls | head -n 1
a

# for i in $(ls); do echo "file: $i"; done
file: a
file: b
file: c
file: d

どうすれば ls がそのようになり、呼び出し時にすべてを 1 行に表示できるでしょうか?

タブの使用は機能しません。改行は、強制的に複数行にするだけです。\000 は使えません。

# echo -e "a\tb\tc\td" | head -n 1
a    b    c    d

echo -e "a\000b\000c\000d" | head -n 1
abcd

cat -A ではあまり情報が得られません...

# cat -A <(ls --color=no)
a$
b$
c$
d$

# cat -A <(echo -e "a\nb\nc\nd")
a$
b$
c$
d$

だから..スクリプトで同じタイプの出力を生成するにはどうすればよいですか? ここで不足している制御文字はありますか?

4

3 に答える 3

8

トリックは、出力が端末であるかどうかを検出するlsことです。この場合、列を使用するか、そうでない場合は、より単純な形式で出力します。

os.isatty()Unix では、Python の関数を使用してこの情報を取得できるはずです。

tty(1)シェルから、次のプログラムを使用できますtty -s <&1。stdout が tty の場合は true で終了し、そうでない場合は false で終了します。tty実際にはstdinをチェックし<&1ますが、stdoutをstdinにリダイレクトしてstdoutを効果的にチェックできます。

于 2012-05-28T11:35:11.620 に答える
4

最初の回答は受け入れられましたが、ここに完全な例があります..

猫のテスト.py

#!/usr/bin/env python

import os

if os.isatty(1):
    print 'is tty'
else:
    print 'is script'

そして出力:

# python test.py
is tty

# python test.py | tail -n 1
is script
于 2012-05-28T11:53:15.637 に答える
3

バッシュの場合:

#!/bin/bash
if [[ -p /dev/stdout || ! -t 1 ]]    # output is to a pipe or redirected
then
    printf '%s\n' "$@"
else                                 # output is to the terminal
    printf '%s' "$*"
    printf '\n'
fi

参考:for i in *代わりに使用for i in $(ls)

于 2012-05-28T12:21:22.067 に答える