OSDN Git Service

Merge "cat builtin: permit interrupt during writing; more: avoid SIGPIPE"
[android-x86/external-mksh.git] / mkshrc
diff --git a/mkshrc b/mkshrc
index 6d135a3..6c20d1f 100644 (file)
--- a/mkshrc
+++ b/mkshrc
@@ -1,4 +1,4 @@
-# Copyright (c) 2010, 2012, 2013
+# Copyright (c) 2010, 2012, 2013, 2014
 #      Thorsten Glaser <tg@mirbsd.org>
 # This file is provided under the same terms as mksh.
 #-
@@ -54,20 +54,23 @@ function hd {
 }
 
 function more {
-       local dummy line llen curlin=0
-
-       cat "$@" | while IFS= read -r line; do
-               llen=${%line}
-               (( llen == -1 )) && llen=${#line}
-               (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 ))
-               if (( (curlin += llen) >= LINES )); then
-                       print -n -- '\033[7m--more--\033[0m'
-                       read -u1 dummy
-                       [[ $dummy = [Qq]* ]] && return 0
-                       curlin=$llen
-               fi
-               print -r -- "$line"
-       done
+       (
+               set +m
+               cat "$@" |&
+               trap "rv=\$?; kill $! >/dev/null 2>&1; exit \$rv" EXIT
+               while IFS= read -pr line; do
+                       llen=${%line}
+                       (( llen == -1 )) && llen=${#line}
+                       (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 ))
+                       if (( (curlin += llen) >= LINES )); then
+                               print -n -- '\033[7m--more--\033[0m'
+                               read -u1 || exit $?
+                               [[ $REPLY = [Qq]* ]] && exit 0
+                               curlin=$llen
+                       fi
+                       print -r -- "$line"
+               done
+       )
 }
 
 function setenv {