Я не уверен, что это ", не делайте этого " тоже ...
Благодаря чрезвычайно полезному обсуждению в https://unix.stackexchange.com/questions/213799/can-bash-write-to-its-own-input-stream/ ...
Утилита tailcd
(для "tail-call cd
"), которая работает как в bash, так и под Midnight Commander, позволяет использовать в таких скриптах, как
/ бен / mkcd:
mkdir "$1" && tailcd "$1"
Реализация сложная и требует xdotool
. Команда tailcd
должна быть последней командой в сценарии (это типичное требование совместимости для утилит, которые допускают несколько реализаций). Он взламывает поток ввода bash, а именно вставляет в него cd <dirname>
. В случае Midnight Commander, он дополнительно вставляет две Ctrl + O (команды включения / выключения панелей) и очень хакерским способом использует sleep для межпроцессной синхронизации (что обидно, но работает).
/ бен / tailcd:
#! /bin/bash
escapedname=`sed 's/[^a-zA-Z\d._/-]/\\\\&/g' <<< "$1"`
if [ -z "$MC_TMPDIR" ] ; then
xdotool type " cd $escapedname "; xdotool key space Return
else
(sleep 0.1; xdotool type " cd $escapedname "; xdotool key space Return Ctrl+o; sleep 0.1; xdotool key Ctrl+o )&
fi
(пробел до cd
не позволяет вставленной команде перейти в историю; для работы требуются пробелы после имени каталога, но я не знаю почему.)
Другая реализация tailcd
не использует xdotool
, но она не работает с Midnight Commander:
#!/bin/bash
escapedname=`sed 's/[^a-zA-Z\d._/-]/\\\\&/g' <<< "$1"`
perl -e 'ioctl(STDIN, 0x5412, $_) for split "", join " ", @ARGV' " cd" "$escapedname" $'\r'
В идеале tailcd
будет / должно быть частью bash, использовать обычное межпроцессное взаимодействие и т. Д.