Dlaczego cd drukuje się, gdy jest uruchamiany w podstawianiu poleceń?


3

Jeśli użyję wbudowanego w cd polecenia „cd” BASH, wypisuje on dodatkowe rzeczy na standardowe wyjście, ale tylko wtedy, gdy zostanie potokowane, np. Mniej.

$ echo `cd .`

# The output is a single newline, appended by echo.


$ echo `cd .` | less
# less displays:
ESC]2;my.hostname.com - tmp/testenv^G
(END) 

Co się tam dzieje? To zachowanie nie jest udokumentowane na stronie podręcznika bash dla cd. Oczywiście uruchamianie po prostu „cd” w podstawianiu poleceń jest głupie, ale coś w tym stylu

NEWDIR=`cd mypath; pwd`

może być przydatne.

Rozwiązałem to, używając

NEWVAR=`cd mypath > /dev/null 2>&1; pwd`

ale nadal chcę wiedzieć, co się dzieje.

Wersja Bash: GNU bash, wersja 3.2.25 (1) -release (x86_64-redhat-linux-gnu) Copyright (C) 2005 Free Software Foundation, Inc.

Distro: Scientific Linux SL wersja 5.5 (Boron)


Nie mogę powtórzyć opisanego zachowania. Czy używasz $ CDPATH? To sprawia, że cd wypisz prawdziwą ścieżkę. A może zdefiniowałeś Alias dla cd?
choroba

Biegać type cd, wynik powinien być cd is a shell builtin. Upewnić się echo `builtin cd .` | less powoduje to samo. Wymusza użycie wbudowanego polecenia powłoki. Nie można repro, bash 3.2.48 (1) na OS X.
Daniel Beck

Myślę, że coś się zmieniło od czasu bash 3.2. Zobacz ten wątek: lists.gnu.org/archive/html/bug-bash/2007-04/msg00019.html Problem polega na tym, że POSIX wymaga drukowania katalogu, w którym użyto CDPATH, nawet jeśli nie jest interaktywny. Dlaczego to się zmieniło w bashu 4.x Nie wiem, ale nie mogę go tam odtworzyć.
reasgt

Zastosowanie command omija użycie wbudowanego basha, ale zamiast tego wykonuje program zwrócony z which cd.
Daniel Beck

Odpowiedzi:


0

Widzisz sekwencję ucieczki xterm (ESC 2; nowy-tytuł ^ G), aby zmienić tytuł okna.

(Poniżej znajduje się głównie przypuszczenie.)

Kiedy piszesz dane wyjściowe do terminala, emulator terminala (zgaduję) usuwa go ze strumienia przed wyświetleniem go na ekranie. Gdy potokujesz wyjście przez less, widzisz całe wyjście.

Sprawdź wartość $PROMPT_COMMAND; może pojawić się tam polecenie, które wypisuje ciąg (prawdopodobnie z udziałem $PWD lub połączenie do pwd ).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.