2012-10-27 32 views
0

對於〔實施例中,mysql命令顯示基於輸出不同的結果重定向

mysql -e 'show databases' 

+--------------------------+ 
| Database     | 
+--------------------------+ 
| information_schema  | 
| mysql     | 
| performance_schema  | 
+--------------------------+ 

但是當你重定向到一個文件,內容是不同的,例如

mysql -e 'show databases' > /tmp/test.txt 
cat /tmp/test.txt 

Database 
mysql 
performance_schema 
+1

請告訴我問題嗎?你問爲什麼不同?或者如何在你自己的腳本中做這種事情? –

回答

4

這是通過使用isatty()呼叫如果stdout連接到一個TTY檢查完成(在C,代替您所選擇的語言當量)。

+1

我想你在這裏需要'STDOUT_FILENO',而不是'STDOUT'。此外,這隻適用於POSIX;對於Win32,你可以用'_isatty(_fileno(stdout))'代替;對於其他平臺...讓我們希望沒有人關心。 – abarnert

2

對於Python,您可以使用sys.stdout.isatty()

test.py

import sys 

if sys.stdout.isatty(): 
    print 'Yep' 
else: 
    print 'Nope' 

而且演示:

$ python2 test.py           
Yep 
$ python2 test.py | cat 
Nope 
$ python2 test.py > test.txt 
$ cat test.txt 
Nope 
+0

'mysql'似乎在(至少)Windows和* nix上都這樣做。是不是Python的'file.isatty()'只有Unix?或者它在Windows上執行一些魔術而不是'os.isatty(self.fileno())',所以它是跨平臺的? – abarnert

+0

@abarnert:我沒有安裝Windows,所以我無法測試它,但它似乎是'isatty()'是僅限於Unix的。 – Blender

+0

這就是我所擔心的。在C語言中有一個相當於Windows的東西,如果最壞的情況出現,你總是可以用'ctypes'來包裝'(我認爲)'MSVCRT.DLL',但這不像OP可能希望的那麼簡單... – abarnert