2012-04-10 3 views
3

Ich versuche, das Datum der Ausführung meines Befehls anzuzeigen. So verwende ich Variablen Bash-Umgebung PS4 heresetzen Sie sowohl PROMPT_COMMAND und PS4 (mit Datum beim Start des Befehls und tricky gedruckten Pfad)

PS1="[\[email protected]\h \W]\\$ " 
PS4=:\D{%F %T}: ; set -x 

geben, was mir die folgende Meldung gibt

[[email protected] temp]$ \ls 
:2012-04-10 13:43:52: ls 
dir1 dir12 test 
[[email protected] temp]$ 

In einer anderen Seite Ich mag würde meinen Weg haben, nicht zu lang, wenn ich in einem tiefen bin Verzeichnis (es ist sehr oft zu sagen). Ich fand den folgenden Code (ich erinnere mich nicht, wo), die

bash_prompt_command() { 
# How many characters of the $PWD should be kept 
local pwdmaxlen=25 
# Indicate that there has been dir truncation 
local trunc_symbol=".." 
local dir=${PWD##*/} 
pwdmaxlen=$(((pwdmaxlen < ${#dir}) ? ${#dir} : pwdmaxlen)) 
NEW_PWD=${PWD/#$HOME/\~} 
local pwdoffset=$((${#NEW_PWD} - pwdmaxlen)) 
if [ ${pwdoffset} -gt "0" ] 
then 
    NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen} 
    NEW_PWD=${trunc_symbol}/${NEW_PWD#*/} 
fi 
} 
PS1="[\[email protected]\h \${NEW_PWD}]\\$ " 
PROMPT_COMMAND=bash_prompt_command 

ist sehr gut, die mir das folgende

[[email protected] semishort_path]$ 

Das Problem gibt tritt auf, wenn ich beide PS4 verwenden und PROMPT_COMMAND was mir gibt, dass schreckliche Sache:

[[email protected] temp]$ \ls 
:2012-04-10 13:48:32: ls 
dir1 dir12 test 
::2012-04-10 13:48:32: bash_prompt_command 
::2012-04-10 13:48:32: local pwdmaxlen=25 
::2012-04-10 13:48:32: local trunc_symbol=.. 
::2012-04-10 13:48:32: local dir=temp 
::2012-04-10 13:48:32: pwdmaxlen=25 
::2012-04-10 13:48:32: NEW_PWD='~/temp' 
::2012-04-10 13:48:32: local pwdoffset=-19 
::2012-04-10 13:48:32: '[' -19 -gt 0 ']' 
[[email protected] temp]$ 

Befehle in der Funktion PROMPT_COMMAND verwendet werden von PS4 angezeigt.

Ich bin auf der Suche nach einem Weg, um diesen Effekt zu vermeiden:

  • durch die Echtzeit-Anzeige (aktualisiert jede Sekunde auf der gleichen Eingabeaufforderung) in meinem Prompt (PS1 oder PROMPT_COMMAND)
  • einen anderen Weg finden um die Pfadlänge zu reduzieren (Ich muss die letzten zwei Verzeichnisse ausgedruckt haben, wenn ich nicht bei ~ bin)
  • vielleicht andere Ideen ???

Ich weiß, das ist ein kniffliges Problem, aber ich denke, BASH sollte tun können, was ich will!

Antwort

3

Die einfachste Methode ist ein Code vor jeder Ausgabe

function tsprint() { 
     if [[ $BASH_COMMAND != bash_prompt_command ]] 
     then 
       echo $(date) ": $BASH_COMMAND" 
     fi 
} 
PS1="[\[email protected]\h \${NEW_PWD}]\\$ " 
PROMPT_COMMAND="bash_prompt_command;trap 'tsprint; trap DEBUG' DEBUG" 

Hier die Beispielbefehl ausführen:

[[email protected] ~]$ cd Music/ 
Fri Apr 13 02:22:34 EEST 2012 : cd Music/ 
[[email protected] ~]$ ls 
Fri Apr 13 02:22:34 EEST 2012 : ls --color=auto 
[[email protected] ~/Music]$ 
[[email protected] ~/Music]$ pwd 
Fri Apr 13 02:22:39 EEST 2012 : pwd 
/home/shaman/Music 
[[email protected] ~/Music]$ 
[[email protected] ~/Music]$ 
+0

Dies ist ein guter Anfang ... Das Problem ist, dass die gedruckte Pfad aktualisiert vor der Ausführung des Befehls, der den gedruckten Pfad direkt nach einem 'cd'-Befehl falsch macht. Haben Sie eine Idee, dieses Problem zu lösen? – Sigmun

+0

Ich denke, ich löse das Problem, indem ich den 'bash_prompt_command' direkt in' PROMPT_COMMAND' und nicht in 'falle' platziere (ich bearbeite deine Antwort). Ich arbeite für mich, woran denkst du? – Sigmun

Verwandte Themen