Próbuję skompilować wxWidgets przy użyciu MingW i mam cygwina na mojej ścieżce, co wydaje się być w konflikcie. Chciałbym więc usunąć /d/Programme/cygwin/bin
ze zmiennej PATH i zastanawiam się, czy istnieje jakiś elegancki sposób na zrobienie tego.
Naiwnym podejściem byłoby echo do pliku, usunięcie go ręcznie i źródło, ale założę się, że jest lepsze podejście do tego.
bash
shell
environment-variables
path
Devolus
źródło
źródło
Odpowiedzi:
Nie ma standardowych narzędzi do „edycji” wartości $ PATH (tzn. „Dodaj folder tylko wtedy, gdy jeszcze nie istnieje” lub „usuń ten folder”). Po prostu wykonujesz:
tak byłoby w przypadku bieżącej sesji, jeśli chcesz zmienić na stałe, dodaj ją do dowolnego profilu .bashrc, bash.bashrc, / etc / - niezależnie od potrzeb systemu i użytkownika. Jeśli jednak używasz BASH, możesz również wykonać następujące czynności, jeśli, powiedzmy, chcesz usunąć katalog
/home/wrong/dir/
ze zmiennej PATH, zakładając, że jest on na końcu:Więc w twoim przypadku możesz użyć
źródło
/
coś takiego|
:PATH=$(echo "$PATH" | sed -e 's|:/d/Programme/cygwin/bin$||')
aby zapobiec ucieczce.W bash:
Jeśli nie używasz zmiennej pośredniej, musisz zabezpieczyć
/
znaki w katalogu, aby usunąć, aby nie były traktowane jako koniec wyszukiwanego tekstu.Pierwsza i trzecia linia są ustawione tak, aby każdy komponent ścieżki wyszukiwania był otoczony
:
, aby uniknąć specjalnego umieszczenia pierwszego i ostatniego komponentu. Drugi wiersz usuwa określony komponent.źródło
Po rozważeniu innych przedstawionych tutaj opcji i niezrozumieniu, jak niektóre z nich działały, opracowałem własną
path_remove
funkcję, którą dodałem do mojej.bashrc
:Skończyło się to dość blisko rozwiązania Gillesa, ale zostało zamknięte jako funkcja bash, której można łatwo użyć w wierszu poleceń.
Ma tę zaletę, że jako funkcja bash działa jak program bez konieczności bycia programem na ścieżce i nie wymaga uruchamiania żadnych zewnętrznych programów, wystarczy manipulacja ciągiem bash.
Wydaje się dość solidny, w szczególności nie zmienia
somepath:mypath/mysubpath
sięsomepath/mysubpath
: jeśli uruchomiszpath_remove mypath
, co było problemem z moją poprzedniąpath_remove
funkcją.Doskonałe objaśnienie działania manipulacji ciągiem bash można znaleźć w Advanced Bash-Scripting Guide .
źródło
Tak więc, łącząc odpowiedzi z @ gilles i @ bruno-a (i kilku innych sztuczek sed) wymyśliłem ten jednowierszowy, który usunie (każdy) REMOVE_PART z PATH, niezależnie od tego, czy występuje na początku, środek lub koniec ŚCIEŻKI
To trochę nieporęczne, ale fajnie jest móc to zrobić za jednym razem.
;
Służy do łączenia ze sobą dwóch oddzielnych sed polecenia:s@:$REMOVE_PART:@:@g
(który zastępuje:$REMOVE_PART:
jednym:
)s@^:\(.*\):\$@\1@
(który usuwa główne i końcowe dwukropki, które dodaliśmy za pomocą polecenia echo)I w podobny sposób właśnie udało mi się wymyślić ten jeden wiersz do dodawania ADD_PART do ŚCIEŻKI, tylko jeśli ŚCIEŻKA jeszcze go nie zawiera
Zmień ostatnią część na,
echo "$PATH:$ADD_PART"
jeśli chcesz dodać ADD_PART na końcu ŚCIEŻKI zamiast na początku....
... lub aby było to jeszcze łatwiejsze, utwórz skrypt wywoływany
remove_path_part
z zawartościąoraz skrypt wywoływany
prepend_path_part
z zawartościąoraz skrypt wywoływany
append_path_part
z zawartościąuczyń je wszystkimi wykonywalnymi, a następnie wywołać je w następujący sposób:
PATH=$(remove_path_part /d/Programme/cygwin/bin)
PATH=$(prepend_path_part /d/Programme/cygwin/bin)
PATH=$(append_path_part /d/Programme/cygwin/bin)
Zgrabnie, nawet jeśli sam tak mówię :-)
źródło
O wiele prostsza jedna wkładka.
źródło
Ciekawym ćwiczeniem jest napisanie funkcji bash w celu usunięcia katalogu ze zmiennej ścieżki.
Oto niektóre funkcje, których używam w moich plikach .bash * do dodawania / dodawania katalogów do ścieżek. Mają one tę zaletę, że usuwają zduplikowane wpisy, jeśli takie istnieją, i działają z dowolnym rodzajem zmiennej oddzielonej dwukropkami (ŚCIEŻKA, MANPATH, INFOPATH, ...). funkcja remove_from usuwa katalog.
źródło
Poniżej znajduje się poprawiony kod z rozwiązania Grega Tarsy. Używane są tylko wbudowane polecenia bash. W ten sposób zaoszczędzi wiele wywołań systemowych fork ().
źródło
Aby uzupełnić / poprawić akceptowaną odpowiedź od Tushar, możesz:
-e
opcję, jak na stronie podręcznika sed : „Jeśli nie podano opcji -e, --expression, -f lub --file, pierwszy skrypt nie będący opcją jest traktowany jako skrypt sed do interpretacji.”g
flagi (globalnej), aby usunąć wszystkie wystąpieniaW końcu daje coś takiego:
źródło
Obecne odpowiedzi nie rozwiązują mojego podobnego problemu, ponieważ muszę usunąć wiele ścieżek. Wszystkie te ścieżki są podkatalogami jednego katalogu. W takim przypadku ta jedna linijka działa dla mnie: (załóżmy, że wzór polega na
cygwin
usunięciu wszystkich ścieżek, które zawieracygwin
)źródło