використовуючи xargs для CD в каталог


Відповіді:


22

Труба виконує xargs у підпроцесі, а xargs виконує cd у підпроцесі. Зміни підпроцесу не поширюються на батьківський процес.


Це має повний сенс. Дякуємо за допомогу у нобібсі Unix.
Іван Лотинський

3
Ви можете отримати потрібний ефект, використовуючи зворотні лапки: cd `echo "/some/directory/path" | cut -d\ -f1` (Зверніть увагу, що я додав "вирізати", щоб розділити на пробіли і схопити перший елемент так, як це робить xargs)
Slartibartfast

5
Насправді, xargsне можна запускати, cdоскільки це, обов`язково, вбудована оболонка і xargsможе запускати лише стоячі виконувані файли. Однак ви сказали, що це стосується підпроцесів.
Призупинено до подальшого повідомлення.

/ usr / bin / cd - це, безумовно, вільно стояча документована команда Unix, принаймні, на Solaris.
jlliagre

Використання @Slartibartfast для автогенерованих контурів: cd `port file libcudd | sed -e 's/\/Portfile//'` (як правило, довгі, з якими ви не хочете обробляти вручну, як, наприклад, це місце розташування портфайлів MacPorts).
Іоанніс Філіппідіс

23

Команда cdє вбудованою, оскільки інформація про поточний каталог пов'язана з процесом, і лише вбудована оболонка може змінювати поточний каталог запущеної оболонки.

У коді є дві проблеми:

  1. xargsне може запускатися, cdоскільки cdце вбудована команда і xargsможе запускати лише виконувані файли.
  2. Навіть якщо ви працюєте cdв підпроцесі, викликаному з xargs, це не матиме жодного впливу на батьківський процес, як пояснено вище.

Рішення полягає в запуску підколон, всередині нього запустіть, cdі тоді ви можете виконувати команди в новому поточному каталозі.

ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'

Немає сенсу робити ls | xargs ...в цьому прикладі. Це має бути перехідним значенням $0, наприклад,echo "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
wisbucky

ІМО кращим рішенням буде: ls | xargs -L 1 -I @@ bash -c 'cd @@ && pwd && ls'
Роман М
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.