Відчуваю себе як ідіот прямо зараз. Чому це не працює?
echo "/some/directory/path" | xargs -n1 cd
Відчуваю себе як ідіот прямо зараз. Чому це не працює?
echo "/some/directory/path" | xargs -n1 cd
Відповіді:
Труба виконує xargs у підпроцесі, а xargs виконує cd у підпроцесі. Зміни підпроцесу не поширюються на батьківський процес.
cd `echo "/some/directory/path" | cut -d\ -f1` (Зверніть увагу, що я додав "вирізати", щоб розділити на пробіли і схопити перший елемент так, як це робить xargs)
xargsне можна запускати, cdоскільки це, обов`язково, вбудована оболонка і xargsможе запускати лише стоячі виконувані файли. Однак ви сказали, що це стосується підпроцесів.
cd `port file libcudd | sed -e 's/\/Portfile//'` (як правило, довгі, з якими ви не хочете обробляти вручну, як, наприклад, це місце розташування портфайлів MacPorts).
Команда cdє вбудованою, оскільки інформація про поточний каталог пов'язана з процесом, і лише вбудована оболонка може змінювати поточний каталог запущеної оболонки.
У коді є дві проблеми:
xargsне може запускатися, cdоскільки cdце вбудована команда і xargsможе запускати лише виконувані файли.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'