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)

reasgt
źródło
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 ).

chepner
źródło