it-swarm-eu.dev

Spusťte konkrétní příkaz v daném adresáři, aniž byste do něj museli cdovat?

Existuje způsob, jak provést příkaz v jiném adresáři, aniž byste do něj museli cd? Vím, že jsem mohl jednoduše cd dovnitř a cd ven, ale zajímám se jen o možnosti vynechání dalších kroků :)

43
Naftuli Kay

Nevím, jestli se to počítá, ale můžete vytvořit podshell:

$ (cd /var/log && cp -- *.log ~/Desktop)

Adresář se změní pouze pro tento podshell, takže se vyhnete práci, kterou potřebujete k cd - později.

56
Michael Mrozek

Některé programy mají možnosti, které jim můžete sdělit chdir (2) (např. GNU tar = '-C/--directory).

Mimo takové programy však bude něco muset chdir. Místo toho, aby to Shell udělal, byste mohli psát a používat nějaký kompilovaný „binární“ program, 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"

Protože je vzorec *.log Rozšířen samotným Shellem (nikoli cp), něco bude muset do adresáře chdir, než bude mít Shell vyhodnotit svůj příkaz.

Pokud jste jen zajímaví, abyste se vyhnuli „cd zpět“, můžete použít subshell k izolaci účinku cd od vaší pracovní instance Shell.

(cd /path/to/dir && some command)

Můžete to zabalit do funkce Shell. (Z vašeho příkladu použití jsem vynechal možnost -d, Protože na tento příkaz není žádný 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
14
Chris Johnsen

Abychom neoslabili hodnotu odpovědí jiných lidí, ale věřím, co chcete je to:

(cd /path/to && ./executable [ARGS])

Všimněte si paren, aby ve vedlejším shellu vyvolali cd.

11
alex

Zde je něco, co by vám mělo umožnit cd zpět tam, kde jste byli (pomocí Bash), protože nezapomenout na to se zdá být účelem této otázky:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(ÚPRAVA: mírně kratší verze, díky @ Random832)

4
Bruno

Váš příklad je bohužel:

execindirectory -d /var/log "cp *.log ~/Desktop"

nepotřebuje změnu dir, protože

cp /var/log/*.log ~/Desktop

udělá to samé. Nemůžete se přiblížit ke svému skutečnému problému? Protože bychom mohli znát i lepší řešení.

Složitý způsob, jak vyřešit váš problém, který je daleko od elegance Michaelsova řešení, je použití find, který má přepínač '-execdir', který má být proveden v dir, kde je nalezen soubor. Špatně přizpůsobený vašemu příkladu:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

Možná je to užitečné pro váš skutečný problém. -okdir místo -execdir vás požádá o potvrzení každé vyvolání.

-okdir a -execdir možná potřebují nainstalovat gnu-find, který se obvykle používá v Linuxu.

2
user unknown

Co takhle ./your/path/command.sh?

1
bdictator