Вы не так далеко.
Вы можете направить свой вывод echo
в субоболочку
echo -n "foo" | ([[ "$check" -eq 1 ]] && xclip -selection clipboard || cat - )
В этом коде будет использоваться ваш echo
в качестве ввода либо xclip
, либо cat
в зависимости от условия.
Редактировать:
Если вы также хотите, чтобы команда потерпела неудачу, если xclip
не удалось,Вы можете сделать следующее:
echo -n "foo" | ( ( [[ "$check" -ne 1 ]] && cat - ) || ( [[ "$check" -eq 1 ]] && xclip -selection clipboard ) )
Но этот способ может быть менее читабельным, чем ваш многострочный код.
Многострочное решение с одним echo
может быть:
# Create temporary pipe file
PIPE=$(mktemp -u)
mkfifo $PIPE
# Open pipe handles
# 6 can be replaced by any other non-opened fd identifier
exec 6<>$PIPE
# Remove file from disk
rm $PIPE
echo -n "foo" >&6
if [[ "$check" -eq 1 ]]; then
xclip -selection clipboard <&6
else
cat - <&6
fi
# Close file handles
exec 6<&- 6>&-