"op run" changes stdout and stderr to not be TTYs when masking

ddribin
ddribin
Community Member
in CLI

While trying to convert a script from a bunch of op read calls to a single call to op run call, in order to improve performance due to op run being fairly slow, I noticed that stdout and stderr are no longer TTYs when using op run, with masking enabled (the default). This can change the behavior of some commands. The most common case is to disable colors, but I've seen other subtle changes, too, that had me scratching my head until I figured it out what was going on.

I'm not sure how feasible it is to use TTYs when masking, but could this at least be called out in the documenation for op run?

Demo:

$ cat =tty-check
#!/bin/sh

if [ -t 0 ]; then echo "stdin  a terminal"; else echo "stdin  not a terminal"; fi
if [ -t 1 ]; then echo "stdout a terminal"; else echo "stdout not a terminal"; fi
if [ -t 2 ]; then echo "stderr a terminal"; else echo "stderr not a terminal"; fi

$ tty-check
stdin  a terminal
stdout a terminal
stderr a terminal

$ MY_USERNAME=op://private/op-test/username op run -- tty-check
stdin  a terminal
stdout not a terminal
stderr not a terminal

Note that --no-masking keeps them as TTYs:

$ MY_USERNAME=op://private/op-test/username op run --no-masking -- tty-check
stdin  a terminal
stdout a terminal
stderr a terminal

They also stay as TTYs if there are no environment variables with password references:

$ op run -- tty-check
stdin  a terminal
stdout a terminal
stderr a terminal

1Password Version: 8.10.32
Extension Version: Not Provided
OS Version: macOS 14.4.1
Browser: Not Provided

This discussion has been closed.