Nevím, jestli se to počítá, ale můžete vytvořit subshell:
$ (cd /var/log && cp -- *.log ~/Desktop)
Adresář se změní pouze pro tento subshell, takže se vyhnete práci s cd -
poté.
Některé programy mají možnosti, pomocí kterých jim můžete sdělit chdir(2) sami (např. GNU tar -C
/--directory
).
Mimo tyto programy však bude muset něco chdir . Mohli byste napsat a použít nějaký zkompilovaný „binární“ program místo toho, aby to dělal shell, ale pravděpodobně by to nepřineslo mnoho výhod.
V komentáři v jiné odpovědi jste uvedli příklad:
execindirectory -d /var/log "cp *.log ~/Desktop"
Od *.log
vzor je rozbalen samotným shellem (nikoli cp ), bude muset něco chdir do adresáře předtím, než shell vyhodnotí váš příkaz.
Pokud vás zajímá, jak se vyhnout nutnosti „cd back“, pak můžete použít subshell k izolaci efektu cd z vaší pracovní instance shellu.
(cd /path/to/dir && some command)
Můžete to zabalit do funkce shellu. (Vypustil jsem -d
volba z vašeho příkladu použití, protože tento příkaz nemá smysl, pokud je adresář skutečně volitelný.)
runindir() { (cd "$1" && shift && eval "[email protected]"); }
runindir /var/log 'cp *.log ~/Desktop' # your example
runindir /var/log cp \*.log \~/Desktop # eval takes multiple args
runindir /var/log cp \*.log ~/Desktop # it is okay to expand tilde first
Nechci podkopávat hodnotu odpovědí ostatních lidí, ale věřím, že to, co chcete, je toto:
(cd /path/to && ./executable [ARGS])
Všimněte si závorek pro vyvolání cd
v podskořápce.