Hvorfor virker kommandoen "echo "/some/directory/path" | xargs -n1 cd" ikke? - Løsninger og alternativer

Hvorfor virker denne kommando ikke? echo "/some/directory/path" | xargs -n1 cd

Kommandoen `echo "/some/directory/path" | xargs -n1 cd` virker ikke, fordi `cd` er en shell indbygget kommando, og `xargs` kører kommandoer i en subshell, hvilket ikke ændrer arbejdskataloget i den oprindelige shell-session.

Hvorfor virker denne kommando ikke?

Kommandoen echo "/some/directory/path" | xargs -n1 cd virker ikke som forventet af flere grunde:

  • cd er en shell indbygget kommando: cd er en indbygget kommando i shell (som bash eller zsh), og den ændrer kun det nuværende arbejdskatalog for den aktuelle shell-session. Når xargs kører cd, sker det i en separat subshell, og ændringen af arbejdskataloget påvirker ikke den oprindelige shell-session.
  • xargs kører kommandoer i en subshell: Når du bruger xargs til at køre en kommando, kører den kommandoen i en ny subshell. Ændringer foretaget i denne subshell, såsom at ændre arbejdskataloget med cd, påvirker ikke den oprindelige shell-session.
  • Forkert brug af xargs: xargs -n1 betyder, at xargs vil køre kommandoen én gang for hver linje af input. Men cd tager kun ét argument, så det er ikke nødvendigt at bruge -n1 her.

For at ændre det nuværende arbejdskatalog i den aktuelle shell-session, skal du bruge en anden tilgang. Her er nogle alternativer:

Alternativer

  • Direkte brug af cd: Brug cd direkte uden xargs.
    cd /some/directory/path
  • Brug af en subshell: Hvis du vil køre flere kommandoer i et bestemt katalog, kan du bruge en subshell.
    (cd /some/directory/path && other_commands)
  • Brug af pushd/popd: Hvis du midlertidigt vil ændre kataloget og derefter vende tilbage til det oprindelige katalog, kan du bruge pushd og popd.
    pushd /some/directory/path
    # Run your commands here
    popd