"op run" changes stdout and stderr to not be TTYs when masking
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