2013-09-04 32 views
7

Đây là nhiệm vụ cụ thể mà tôi đang cố gắng hoàn thành. zsh cư xử theo cách tôi thíchCách chính xác để chuyển hướng cả stdout và stderr trong bash là gì?

$ zsh 
$ which clang > /dev/null 2&>1 && echo clang || echo gcc 
clang 
$ which doesntexist > /dev/null 2&>1 && echo doesntexist || echo gcc 
gcc 

Nhưng, trong bash:

$ bash 
$ which clang > /dev/null 2&>1 && echo clang || echo gcc 
gcc 

Đây là trường hợp chung:

$ which clang > /dev/null 2&>1; echo $? 
1 
$ which clang; echo $? 
/usr/bin/clang 
0 

Có điều gì đó sai với cách tôi đang chuyển hướng đầu ra. Cách đúng là gì?

Trả lời

11

Tôi nghĩ rằng bạn đang chuyển hướng một cách sai lầm:

which clang > /dev/null 2&>1; echo $? 

Nên

which clang > /dev/null 2>&1; echo $? 

Đây có thể là như thế nào một trong hai vỏ cho phép các phương pháp cũ. Trong bash nó không phải là cách đúng. Bash sẽ giải thích nó thay vì như:

which clang >/dev/null 2 &>1; echo $? 

Trong đó 2 được thêm làm đối số.

Bạn có thể xác minh rằng bằng cách tạo ra một chức năng như

e() { echo "[email protected]" >e.log; } 

Và gọi nó là:

e 1 >/dev/null 2&>/dev/null 

Và bạn sẽ nhận được 1 2 trong e.log.

Trong bash nó cũng đơn giản hơn nếu bạn gọi lệnh như dưới đây:

which clang &>/dev/null; echo $? 

Ngoài ra thay vì gọi một nhị phân bên ngoài như which, sử dụng type -P để thay thế. Không cần phải chuyển hướng đầu ra stderr quá.

type -P clang >/dev/null; echo $? 
0

Sử dụng này:

which gcc >& /dev/null && echo gcc || echo clang 

Ngoài ra bạn có thể sử dụng này:

[[ $(which gcc) ]] && echo gcc || echo clang # prints gcc 
[[ $(which clang) ]] && echo gcc || echo clang # prints clang 

này hoạt động bởi vì trong [[ ]] chuỗi rỗng là falsey.

3

Bạn đang sử dụng toán tử &> của zsh, chuyển hướng stderr và stdout. Cách bạn đã sử dụng nó cho thấy bạn có nghĩa là ... > /dev/null 2>&1 thay thế.

Tôi sẽ làm như sau:

$ cc=$(type -P clang gcc othercc | head -n 1) 
$ echo $cc 
/usr/bin/clang