2013-04-18 27 views
6

Nó khá đơn giản và tôi không có ý tưởng. Tôi chắc rằng có một giải pháp nhanh chóng.Chuyển hướng trong PHP exec gọi tạo tệp trống

exec('echo 123 &> /var/log/123.log'); 

Tôi chắc chắn nó không phải về quyền, vì tệp 123.log được tạo nhưng nó chỉ trống. Tôi cũng đã thử shell_exec, nhưng nó không tạo ra tập tin nào cả. Cũng đã thử tất cả các biến thể chuyển hướng, tức là 1> 2> >.

Sử dụng PHP để nắm bắt đầu ra không phải là tùy chọn, vì đầu ra trong quá trình sản xuất rất lớn và tôi không muốn chạy vào các vấn đề về bộ nhớ.

Bất kỳ ý tưởng nào được đánh giá cao.

Btw, tôi đang sử dụng Ubuntu 12.04 LAMP.

+0

bạn đã thử 'echo 123 &>/var/log/123.log' trong thiết bị đầu cuối chưa? –

+0

bạn có 100% tích cực không cho phép không? Hãy thử làm các câu lệnh echo bằng tay trong thiết bị đầu cuối và xem nếu nó hoạt động – 1337holiday

+0

Xác minh, điều này đã không làm việc cho tôi hoặc. Sử dụng PHP 5.3.10-1ubuntu3.4 với Suhosin-Patch. –

Trả lời

0

Hãy thử shell_exec mà không &:

echo shell_exec("echo 123 > /var/log/123.log"); 
0

điều duy nhất mà đã giúp đỡ là tạo ra một kịch bản shell với quyền exec, ví dụ test.sh:

#!/bin/bash 
echo 123 &>> /var/log/123.log 

và thực hiện nó như thế này:

shell_exec('[full path to]/test.sh'); 

Vì vậy, nhà điều hành chuyển hướng không quan trọng, nhưng mọi thứ khác là (# chỉ thị, shell_exec!).

+0

Lý do là chuyển hướng cli được xử lý bởi trình bao, và chỉ theo cách này, chúng tôi chắc chắn rằng bash được thực thi. Tôi không chắc làm thế nào exec giải thích các lệnh khác. – tishma

+0

Chỉ để hoàn thành: một cách khác để đảm bảo rằng bash được sử dụng là 'shell_exec ('/ bin/bash -c \' echo 123 &> /var/log/123.log \ '')'. Nhưng tôi thừa nhận điều đó rất xấu. –

0

Bản phát hành Linux dựa trên Debian và Debian như Ubuntu đang sử dụng dấu gạch ngang và không bash dưới dạng/bin/sh bây giờ.

&> là tiện ích mở rộng bash, dấu gạch ngang không biết.

Cách posix tương thích chính xác để viết cmd &> filecmd > file 2>&1

cmd > file 2>&1 công trình trong tất cả các vỏ posix tương thích: dấu gạch ngang, bash, ksh, zsh, tro ...

Vì vậy, bạn cần phải thay đổi mã tới:

exec('echo 123 > /var/log/123.log 2>&1'); 
+0

Nó chỉ là về trật tự. chỉ 'exec ('echo 123> ./123.log &');' cũng phạt –

+0

@AlexandrKapustin: Không, điều đó sẽ chỉ chạy 'echo 123> ./123.log' trong nền. –

Các vấn đề liên quan