我希望在bash或python脚本中创建与ls创建的输出相同的输出。 我不是指列出目录,但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
如何才能这样,并在调用时仍然在一行中显示所有内容?
使用制表符不起作用。换行符只是强制它为多行。 \ 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$
那么..如何在我的脚本中生成相同类型的输出?我在这里缺少任何控制角色吗?
答案 0 :(得分:8)
诀窍是检测输出是否是终端,在这种情况下ls
使用或不使用列,在这种情况下它以更简单的格式输出。
在Unix中,您应该能够使用Python的os.isatty()
函数来获取此信息。
在shell中,您可以使用tty(1)
程序:tty -s <&1
。如果stdout是tty,则返回true,否则返回false。 tty
实际上检查了stdin,但是<&1
可以将stdout重定向到stdin以有效地检查stdout。
答案 1 :(得分:4)
首先接受了答案,但这是一个完整的例子..
cat test.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
答案 2 :(得分:3)
在Bash中:
#!/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)