I have various other Linux distros on other partitions and am trying to write a command called "on" that will run a shell command in that distro as the same user and in the same directory as I am in on the host filesystem in a way that preserves arguments containing spaces or wildcard characters.
I have got as far as
#! /bin/sh
# on: Run a command as the same user in the same directory inside a chroot
# Usage: on directory command [args]
chrootdir="$1"
shift
sudo chroot --userspec="`whoami`" "$chrootdir" sh -c "cd \"`pwd`\" && $@"
which will run it as the same user in the same dir, but would fail if there are spaces in the arguments (or the comnand name!).
One solution is a cd-ing wrapper script:
#! /bin/sh
# Run a command in a specified directory
# Usage: runin dir command [args]
cd "$1" && shift && cmd="$2" && shift && exec "$cmd" "$@"
called by
#! /bin/sh
# on: Run a command as the same user in the same directory inside a chroot
# Usage: on directory command [args]
chrootdir="$1"
shift
sudo chroot --userspec="`whoami`" "$chrootdir" runin "`pwd`" "$@"
but the wrapper has to exist in all the chroot environments, which is boring.
Is there a way to make a single command on the host system that makes the "cd" happen in the chroot, correctly preserving all arguments?
Just execute the script and pass the arguments like you do in your script:
sudo chroot --userspec="$(id -u):$(id -g)" "$1" \
sh -c 'cd "$1" && shift && exec "$@"' sudosh "$(pwd)" "$@"
Notes:
$(...)
over backticks\"pwd\"
. If you want to quote something, use printf "%q"
. In this case, pass as parameter and properly quote inside subshell sh -c 'echo "$1"' -- "$(pwd)"