Skip to content
Back to top

# Source code for xonsh.xoreutils.tee

    """A tee implementation for xonsh."""

    def tee(args, stdin, stdout, stderr):
        """A tee command for xonsh."""
        mode = "w"
        if "-a" in args:
            args.remove("-a")
            mode = "a"
        if "--append" in args:
            args.remove("--append")
            mode = "a"
        if "--help" in args:
            print(TEE_HELP, file=stdout)
            return 0
        if stdin is None:
            msg = "tee was not piped stdin, must have input stream to read from."
            print(msg, file=stderr)
            return 1

        errors = False
        files = []
        for i in args:
            if i == "-":
                files.append(stdout)
            else:
                try:
                    files.append(open(i, mode))
                except Exception:
                    print(f"tee: failed to open {i}", file=stderr)
                    errors = True
        files.append(stdout)

        while True:
            r = stdin.read(1024)
            if r == "":
                break
            for i in files:
                i.write(r)
        for i in files:
            if i != stdout:
                i.close()

        return int(errors)

    TEE_HELP = """This version of tee was written in Python for the xonsh project: http://xon.sh
    Based on tee from GNU coreutils: http://www.gnu.org/software/coreutils/

    Usage: tee [OPTION]... [FILE]...
    Copy standard input to each FILE, and also to standard output.

      -a, --append              append to the given FILEs, do not overwrite
          --help     display this help and exit

    If a FILE is -, copy again to standard output."""

    # NOT IMPLEMENTED:
    #  -i, --ignore-interrupts   ignore interrupt signals