From owner-freebsd-hackers@freebsd.org Mon Oct 22 14:35:17 2018 Return-Path: Delivered-To: freebsd-hackers@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 03D0FFFE2C9 for ; Mon, 22 Oct 2018 14:35:17 +0000 (UTC) (envelope-from mber2015@gmail.com) Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 70C017CB57 for ; Mon, 22 Oct 2018 14:35:16 +0000 (UTC) (envelope-from mber2015@gmail.com) Received: by mail-wr1-x42c.google.com with SMTP id d10-v6so5645603wrs.5 for ; Mon, 22 Oct 2018 07:35:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:subject:to:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=UY9OVMWfgST6Lc8VKtozK7cvFjm8HFhfwNJFzjSloIA=; b=IW6W+0Y9rrSti0XGjcE1VC1QblT5/+XMrawqrK+li8uSKsuWTa0hcy8wUlr6Q/RZVl 22xegqDMJcLWxKJD574ERRCF2CVs+yt9l94hEHTKxzovEQUcggzQDD0xfBdctMWG1L7U lY/41V6RsXJFYrJvJq29NG2Bokk96Y6g4BxzclvH+k15XvODmczrdAk6l5g7CRPmd2rH dAoIhtfyV6KRUCZTW7NMQSWaur1uSayWVjJsDVQq3gNT0uUYeFjLa7G3c76k4bms1iTY K+YSBt1YkFwFw3uKwIbcTVON7TD6ZPkdBwPt5LG1+EGzTOPWnYhbfGY5iPS7QtynVTao ydqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:subject:to:references:from:message-id :date:user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=UY9OVMWfgST6Lc8VKtozK7cvFjm8HFhfwNJFzjSloIA=; b=J2PZiOz6XUeo9hPN9INyGZ6Z9VqdzIpYuVoYdToyXdAl6x3YAYS2/YnljRafNVqVab 9GfOcq4Ug4JfrnhqsGKxVsur5EI1072sQlQcHYW3vH+/I5VYswWW8bF6JhXVgVRDKfWz vh4Ax7usVwTCxYCBZmlU6DmanS0slg/R4HZNdvTuGKanJN1VlYgvYmTOSiFH1TZf++4u QMDFERaSnlLsG0SAReVR8udrh/s5PbsE0Iq1MTMWa2HncfIh0qAKY5fs+FXNUynOzdHd 7Y0xu47p5hH4J7N5F2gjI7FbghOHjClS2tRAL9Dx6hgUQDudHMiXK5ejDCv6i43sqATo R7cw== X-Gm-Message-State: AGRZ1gIZGN56rUQ9C2QRVNfsn7LOibpe8lLPZxvYgW/AX9TgQUDmvPkF ADT5fgMwyrbu1HpBKW11NZWAHJBR X-Google-Smtp-Source: AJdET5eEm5SrQ27diPU0Idm0f8tjWGIDmNvamBJUGlpfUxmgCDWHZrFFn2J+z08HuRa86kb5ek25Qw== X-Received: by 2002:adf:de86:: with SMTP id w6-v6mr2475215wrl.295.1540218914671; Mon, 22 Oct 2018 07:35:14 -0700 (PDT) Received: from mb.tns.cz (pha.tns.cz. [84.242.109.107]) by smtp.gmail.com with ESMTPSA id q17-v6sm22266342wrw.19.2018.10.22.07.35.13 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 22 Oct 2018 07:35:13 -0700 (PDT) Sender: Martin Beran Subject: Re: shell read built-in To: freebsd-hackers@freebsd.org References: <2fff355e-a729-d5d3-8199-f2bbba80c112@grosbein.net> <4ad1ea37-4714-a104-89a2-d7aef70d0f89@yuripv.net> <4cd38621-7387-6302-437e-b8fda3fbe1cd@yuripv.net> From: Martin Beran Message-ID: Date: Mon, 22 Oct 2018 16:35:11 +0200 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:60.0) Gecko/20100101 Thunderbird/60.0.1 MIME-Version: 1.0 In-Reply-To: <4cd38621-7387-6302-437e-b8fda3fbe1cd@yuripv.net> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 22 Oct 2018 14:35:17 -0000 On 10/22/18 1:32 PM, Yuri Pankov wrote: > BTW, it looks like last line is still parsed despite not having \n, so > you could workaround it using something like (yes, looks ugly): > > $ printf "foo bar\n" | (while read a b; do printf "%s %s\n" $a $b; done; > if test -n "$a$b"; then printf "%s %s\n" $a $b; fi) > foo bar > $ printf "foo bar" | (while read a b; do printf "%s %s\n" $a $b; done; > if test -n "$a$b"; then printf "%s %s\n" $a $b; fi) > foo bar If code in the while loop is more complex and you do not want to repeat it twice or define a shell function for it, you can use: while { read l; e=$?; [ $e = 0 ]; } || [ -n "$l" ]; do : any code that processes $l [ $e = 0 ] || break done; The condition tests that either read returns 0 (a line terminated by '\n') or puts a nonempty value to $l (the last line not terminated by '\n'). The break command eliminates further read after EOF (nonzero return), because on a terminal, after EOF (pressing ^D), read returns false once. When called again, it continues reading from the terminal until the next ^D. -- Martin Beran