/termrun

Send & run commands in other open Linux terminals

Primary LanguageRustMIT LicenseMIT

termrun

Send & run commands on other open Unix terminals

Useful when making configuration changes that you want other terminals to pick up with source

Usage

$ termrun [--newline] [--all|--pty /dev/pty/N] cmd

Note: Requires sudo each time unless root is set as owner. See Privileges section below

Simple example

Open terminal 1:

$ tty
/dev/pts/2

Open terminal 2:

$ termrun --newline --pty /dev/pts/2 echo hello world 

--newline appends \n to the sent command to actually run

Displayed in open terminal 1:

$ tty
/dev/pts/2
$ echo hello world 
hello world 

Reload all terminals example

$ vim ~/.zshrc # make config changes
$ termrun --newline --all source ~/.zshrc

Install

Cargo

If you're using a recent version of Cargo, you can see the cargo install command:

$ cargo install termrun 

Build from source

After git cloning this repo, you can install as a cargo crate through

$ cargo install --path path/to/repo

This should make termrun available everywhere assuming your cargo crates are in $PATH

Privileges / Post-installation

termrun uses ioctl(2) under the hood through the TIOCSTI cmd flag. To do this successfully, the process needs root user privileges to run.

In practice, this means having to run termrun with sudo. By default when you install global crates, sudo doesn't know about them:

$ termrun
Error: EPERM: Operation not permitted

$ sudo termrun
[sudo] password for user: 
sudo: termrun: command not found

The solutions here are to:

  • (Easiest) Symlink termrun into a sudo-friendly path: sudo ln -s ~/.cargo/bin/termrun /usr/local/bin/
  • Always specify the complete crate path so sudo can find termrun: sudo ~/.cargo/bin/termrun
  • Specify sudo to use your $PATH: sudo env "PATH=$PATH" termrun

License

MIT - Maintained by Milan