PHP output piped to 'less' ต้องการ <enter> หลังจากทุกคำสั่ง


5

การส่งออกไปป์ไลน์ของ PHP ไปยังคำสั่ง 'น้อย' ของ linux จะทำให้ 'น้อย' ลงมือทำจริง ๆ (CentOS 6.2 ไม่ได้เกิดขึ้นกับ CentOS 5)

เมื่อฉันไพพ์เอาต์พุตจาก php เป็น 'less' มันต้องenterกดคีย์หลังจากทุกคำสั่งแม้หลังจากคำสั่ง 'j' (คำสั่งเพื่อเลื่อนลงหนึ่งบรรทัด) นอกจากนี้คีย์คำสั่งจะแสดงขึ้นบนหน้าจอและ 'น้อย' จะไม่ล้างหน้าจอ

ดังนั้นหลังจากทำงาน:

$ php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' | less

จากนั้นพิมพ์j(ซึ่งมักจะเลื่อนลงหนึ่งบรรทัด) ฉันเห็นอักขระ 'j' ปรากฏขึ้นที่ด้านล่างของหน้าจอหลังจากอักขระ ':' การกดenterทำให้น้อยลงจนในที่สุด "รับ" คำสั่ง j และมันจะเลื่อนแน่นอน แต่ตอนนี้ฉันเห็น ": j" ระหว่างสองบรรทัดที่อยู่ติดกันของเอาท์พุท:

10
:j
11

เมื่อใช้งานน้อยลงโดยใช้เอาต์พุตที่เทียบเท่าจาก python ทุกอย่างใช้ได้ดีและทำหน้าที่น้อยลงตามปกติ:

$ python -c 'for i in xrange(1, 300): print i' | less

เกิดอะไรขึ้นและฉันจะแก้ไขได้อย่างไร

ข้อมูลเพิ่มเติม:

$ less --version
less 436
Copyright (C) 1984-2009 Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

$ php --version
PHP 5.3.27 (cli) (built: Aug 26 2013 11:46:37)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies

ฉันใช้ Terminal.app บน Mac OS X เพื่อ ssh ไปยังกล่องจากนั้นเรียกใช้คำสั่ง php


1
อาจเป็นการตั้งค่าเทอร์มินัล (echo $ TERM พูดว่าอะไร) ฉันลองใช้สคริปต์เดียวกันในกล่อง CentOS 6.2 ของฉันและทำงานได้ตามที่คาดไว้ ฉันสงสัยว่ามันอาจเกี่ยวข้องกับวิธีที่เทอร์มินัลของคุณกำลังบุกรุก CR และ LF จะเกิดอะไรขึ้นถ้าคุณใช้ "\ r \ n" แทนที่จะเป็นเพียง "\ n"
davidgo

$ TERM คือ 'หน้าจอ' :) ถ้าฉันลองโดยไม่มีหน้าจอมันจะแสดง 'xterm-256color' แต่ก็ยังใช้งานไม่ได้
แก้ไขเมื่อ

หรือ Ubuntu 13.04 หรือการทดสอบแบบเดเบียนก็ไม่สามารถทำได้ ฉันจะโทษพวกเขาใช้น้อย
Braiam

CentOS 5 เวอร์ชันใดใช้งานได้? ฉันใช้ 5.9 และมันแสดงปัญหาเดียวกับที่คุณกำลังเน้น 6.2
slm

มันทำงานอย่างถูกต้องในการติดตั้ง CentOS 5.5 ของฉัน
ปรับปรุง

คำตอบ:


7

แก้ไข:

พบวิธีแก้ปัญหา:คุณต้องทำ< /dev/nullหลังจากคำสั่ง PHP:

php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' < /dev/null | less

เห็นได้ชัดว่า PHP มีพฤติกรรมแตกต่างไปจากที่คาดstdinไว้
เมื่อ< /dev/nullคุณบังคับให้ PHP คิดว่าไม่มีการป้อนข้อมูลเพิ่มเติม

แก้ไข 2 :

หากคุณไม่ต้องการพิมพ์ (ต่อ) < /dev/nullคุณสามารถสร้างชื่อแทนphp2หรืออะไรก็ได้:

alias php2="php < /dev/null`

~/.bashrcคุณสามารถทำให้ถาวรถ้าคุณเพิ่มไว้ในของคุณ

ตอนนี้คุณสามารถทำได้:

php2 -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' | less

คุณสามารถใช้นามแฝงphpกับตัวเองได้ แต่จากนั้นคุณจะไม่มีความสามารถphpใด ๆ
คุณสามารถย่อให้สั้นลงเป็นp(สำหรับการพิมพ์น้อยลง)


คำตอบเดิม:

ข้อผิดพลาดยังมีอยู่ใน CentOS 6.5

CentOS 6.5 ที่เพิ่งติดตั้งใหม่ก็มีเช่นกัน (ใน VM) ... | cat | lessไม่ทำงาน
A ... > a && cat a | lessใช้งานได้ ไปคิด

php --help | lessปุ่มเคอร์เซอร์ยังไม่ได้ทำงานใน python --help | lessพวกเขาไม่ทำงานใน ดังนั้นมันจะต้องมีบางอย่างในPHP ที่ทำงานได้ ฉันคิดว่านี่เป็นข้อผิดพลาดที่ยาวนานใน PHP

ผมพบว่ามีการอ้างอิงถึงข้อผิดพลาดนี้ที่นี่

จนกว่าจะได้รับการแก้ไขคุณจะต้องทำการเปลี่ยนเส้นทาง:

php -r 'for ($i=0; $i<300; $i++) { print "$i\n";}' > /tmp/php.txt && cat /tmp/php.txt | less

ฉันได้คิด... > tmpfile && cat tmpfile | lessวิธีแก้ปัญหาด้วยตัวเองแล้ว ... มันเป็นวิธีแก้ปัญหาที่น่ารำคาญมาก แต่ก็ใช้งานได้ < /dev/nullวิธีแก้ปัญหาจะดีกว่า แต่ยังคงเป็นเพียงการแก้ปัญหา แต่ฉันให้คุณโปรดปรานสำหรับความพยายาม :)
แก้ไขแล้ว

ฉันเองคิดว่าในขณะที่ PHP อาจมีข้อผิดพลาดที่นี่น้อยกว่าก็มีข้อผิดพลาด โดยปกติ (เช่นกับ CentOS 5) เมื่อฉันมีโปรแกรมที่รันเป็นเวลานานจะยังคงสามารถใช้งานได้น้อยลงในขณะที่ php ยังคงสร้างผลลัพธ์ต่อไป
Eddified

ฉันเพิ่มการแก้ไข # 2 คุณสามารถใช้alias(เช่นphp2) เพื่อ "บรรเทาความเจ็บปวด" :) คุณมี PHP เวอร์ชันเดียวกัน (5.3.3?) ใน CentOS 5 เป็นหนึ่งใน CentOS 6.2 หรือไม่?
Rik

ไม่ฉันเคยใช้ php เวอร์ชั่นอื่นมาก่อน (5.1)
แก้ไขเมื่อ

ฉันเดาว่าเราต้องการคนที่มี RPM ติดตั้ง PHP 5.3.28+ บน CentOS 5 เพื่อทดสอบสิ่งนี้ หรือติดตั้ง PHP 5.1.x บน CentOS 6.2+
Rik

2

นี่เป็นพฤติกรรมแปลก ๆ ยากที่จะทำซ้ำ ... คุณลองตั้งค่า TERM เป็น xterm ธรรมดาแล้วหรือยัง

export TERM=xterm

หรือ vt100

export TERM=vt100

ลองกำหนดขนาดหน้าต่างด้วยตนเอง (จำนวนบรรทัดที่จะเลื่อนปกติ == จำนวนบรรทัดของหน้าต่าง / คอนโซลของคุณ):

...| less --window=80

หรือลอง

... |less --raw-control-chars

หรือ

... |less --RAW-CONTROL-CHARS

PS Oh โดยทาง CentOS 6.2 ได้เปิดตัวในเดือนมิถุนายน 2012 คุณคิดเกี่ยวกับการอัพเกรดเป็นเวอร์ชั่นใหม่กว่าหรือไม่? เวอร์ชัน CentOS ปัจจุบันคือ 6.5 ...


ไม่สามารถใช้คำแนะนำเหล่านี้ได้ ฉันไม่สามารถควบคุมเวอร์ชัน CentOS ได้
ปรับปรุง

มันจะทำงานได้ดีขึ้นเมื่อคุณใช้มันผ่านโปรแกรมอื่นหรือไม่? เช่น... | cat | less
t0r0X

... | cat | lessไม่ช่วย
ปรับปรุง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.