2011-12-27 35 views
8

Tôi có thể nhận đầu vào từ cả một đường ống và một heredoc và sử dụng cả hai từ trong php trên dòng lệnh.php stdin từ bash pipe và heredoc

tôi muốn làm một cái gì đó như thế này:

bash$ ls -l | php <<'code' 
<?php 
    echo $piped; 
?> 
code 

nào phải trả lại kết quả của ls -l

Ngoài ra, tôi có thể sử dụng php -R với đầu vào heredoc cho php script?

+0

@DaveRandom Trong * bash *, ** Ở đây Chuỗi ** cần ba '<' và ** Tài liệu ở đây ** hai '<'. –

+0

@Shiplu Tôi rút lại hàng rào của mình và thừa nhận thất bại (trong đó tôi chưa bao giờ gặp phải điều đó trong bối cảnh bash trước đây). Nhận xét sẽ bị xóa ... – DaveRandom

+0

@DaveRandom: Pedanticism yêu cầu bạn dừng viết các dấu nháy đơn ở những nơi không thích hợp. –

Trả lời

9

Piping

ls -l | php -r 'print_r(file("php://stdin"));'


Heredoc

$ php <<CODE 
<?php 
echo "Hello World\n"; 
?> 
CODE 
Hello World 

Combined

$ ls -l | php <<'CODE' 
<?php 
$f = file("php://stdin"); 
foreach($f as $k=>$v){ 
echo "[$k]=>$v"; 
} 
?> 
Program Finished 
CODE 

[0]=><?php 
[1]=>$f = file("php://stdin"); 
[2]=>foreach($f as $k=>$v){ 
[3]=>echo "[$k]=>$v"; 
[4]=>} 
[5]=>?> 
[6]=>Program Finished 
Program Finished 

Note: Khi bạn sử dụng Đây Documents cho php lệnh mới được bổ sung php mã đè trước stdin

+0

Vì vậy, những gì bạn đang nói là khi bạn kết hợp piping và heredoc, phần đường ống được chà đạp bởi phần heredoc, và không thể được lấy ra? –

+0

@BillyMoon yes. Nó không thể được retrived. –

1

Về -R một phần của câu hỏi:

-R/--process-code

Mã PHP để thực thi cho mọi dòng nhập. Được thêm vào PHP 5.

Có hai biến đặc biệt có sẵn trong chế độ này: $argn$argi. $argn sẽ chứa dòng PHP đang xử lý tại thời điểm đó, trong khi $argi sẽ chứa số dòng. Docs

Nếu tôi hiểu câu hỏi của bạn đúng, bạn đang tìm kiếm các biến $argn. Heredoc nên được hỗ trợ bởi bash của bạn.

Edit: Err, chỉ cần gọi với giá trị trên nhiều dòng:

$ ls -l | php -R ' 
printf("#%02d: %s\n", $argi, $argn); 
' 

(Tôi nghĩ rằng đó là dễ dàng hơn để sử dụng dấu nháy đơn cho công tắc)

+0

Tôi không thể tìm ra cách chuyển một heredoc sang 'php -R' thay vì một chuỗi, và tôi không chắc chắn rằng nó có thể trực tiếp. –

+0

Tồi tệ của tôi, chỉ cần thử một "chuỗi" nhiều dòng thay vì một heredoc. Đã chỉnh sửa câu hỏi để phản ánh điều đó. – hakre

+0

Wow, chuỗi nhiều dòng - những gì một sự mặc khải. Đơn giản và thanh lịch - Tôi không biết gì cả ... Tôi đã dành quá nhiều thời gian để viết javascript gần đây! –