On 04/07/2020 01.09, Vasile Martiniuc wrote:
Good afternoon,

This line is wrong:
pass="$($GPG -d "${GPG_OPTS[@]}" "$passfile" | tail -n
+${selected_line} | head -n 1)" || exit $?

"head -n 1" (or "head -1") exits immediately after reading the first
line. And the "tail" is still writing to the pipe, but there is no
reader because "head" has exited.
It send SIGPIPE from the kernel and it exits with the status code 141.

why is this wrong? the exit status of a pipeline is *just* the last command, and "head -n 1" exits successfully.

another example:

 : [kjetilho@ranger ~]; echo foo | false | head -1
 : [kjetilho@ranger ~]; echo ${PIPESTATUS[*]}, $?
 141 1 0, 0

You should not use "|| exit". The "${PIPESTATUS[@]}" is "0 141 0" and
the password is not copied to the clipboard if there are more than one
line.
I can't copy passwords if there are more lines (10, 20, 30...).


you must be doing something different. have you turned on SIGPIPE delivering signals? SIGPIPE should be ignored in most circumstances.

--
Kjetil T. Homme
Redpill Linpro - Changing the Game

Reply via email to