2012-04-05 6 views
19

Im tratando de trabajar con una ruta de acceso y reemplazar el directorio de inicio con una tilde en bash, estoy esperando hacerlo con tan pocos programas externos como sea necesario. ¿Hay alguna manera de hacerlo con Bash? Obtuve¿Hay una buena manera de reemplazar el directorio de inicio con tilde in bash?

${PWD/#$HOME/\~} 

Pero eso no es del todo cierto. Que necesita para convertir:

/home/alice to ~ 
/home/alice/ to ~/ 
/home/alice/herp to ~/herp 
/home/alicederp to /home/alicederp 

Como nota de interés, aquí está la forma en la fuente de fiesta lo hace cuando se convierte la \w value in the prompt:

/* Return a pretty pathname. If the first part of the pathname is 
    the same as $HOME, then replace that with `~'. */ 
char * 
polite_directory_format (name) 
    char *name; 
{ 
    char *home; 
    int l; 

    home = get_string_value ("HOME"); 
    l = home ? strlen (home) : 0; 
    if (l > 1 && strncmp (home, name, l) == 0 && (!name[l] || name[l] == '/')) 
    { 
     strncpy (tdir + 1, name + l, sizeof(tdir) - 2); 
     tdir[0] = '~'; 
     tdir[sizeof(tdir) - 1] = '\0'; 
     return (tdir); 
    } 
    else 
    return (name); 
} 
+0

Esto no es bash, más como código C. Pero reemplazar una cadena casi sin contexto es propenso a errores. ¿Seguro que quieres proceder de esa manera? – pizza

+1

Disculpe si esto no estaba claro. El código C es un ejemplo de cómo hacerlo. Es como lo hace Bash. bash es un programa escrito en C. Ahora quiero hacer lo mismo en el lenguaje bash. – Jake

+1

¿Puede decirnos qué produce tal como es ahora? – birryree

Respuesta

7

Ver this unix.stackexchange answer:

Si está utilizando bash, entonces la orden interna dirs tiene el comportamiento deseado :

dirs +0 
~/some/random/folder 

Probablemente use el código C de Bash que pegaste allí. :)

Y así es como se podría utilizar:

dir=...      # <- Use your own here. 
pushd "$dir" > /dev/null # Switch to the given directory; 
          # suppress output. 
dir_with_tilde=$(dirs +0) # Run "dirs" and save to variable. 
popd > /dev/null   # Switch back to where we were 
+1

Probablemente quiera' dirs + 0'; de lo contrario, cuando use la pila de directorios ('pushd foo') se mostrará el directorio original (en la parte inferior de la pila) en lugar de la actual. – dcoles

+0

Gracias; corregido La próxima vez, siéntete libre de hacer la corrección directamente. –

+0

Podría hacer 'dir_with_tilde =" $ (cd "$ {dir}" && dirs +0) '' como un trazador de líneas ... Pero esto no funciona si el directorio no existe, ya que no puede cambiar a un directorio inexistente. Puede que esté construyendo un camino para crear y desee registrarlo de manera amigable. –

12

No sé de una manera de hacerlo directamente como parte de una sustitución de variables, pero se puede hacer como comando:

[[ "$name" =~ ^"$HOME"(/|$) ]] && name="~${name#$HOME}" 

Tenga en cuenta que esto no hace exactamente lo que pidió: sustituye "/ home/alice /" con "~ /" en lugar que "~". Esto es intencional, ya que hay lugares donde la barra diagonal posterior es significativa (por ejemplo, cp -R ~ /backups hace algo diferente de cp -R ~/ /backups).

+3

Esta solución no funcionó para mí, ya que corta todo después del "~". P.ej./home/alice/documents se cambia a solo "~", mientras que yo quería simplemente reemplazar la parte del directorio de inicio y devolver "~/documents". Aparentemente, esto no fue un problema para el póster original. Sin embargo, se me ocurrió 'name = $ (echo $ name | sed" s:^$ HOME: ~: ")', que parece hacer lo que _I_ quería. Solo pensé en compartir, ya que vine aquí primero en busca de una solución. – Steinar

+1

@Steinar: Debe hacer lo que quiera, la parte '$ {name # $ HOME}' toma '$ name' y elimina' $ HOME' del frente (es decir, "/ documents" en su ejemplo). ¿Es posible que tengas un error tipográfico? –

+0

@GordonDavisson: Tiene razón, funciona de la manera que yo quería ... Debo haber tenido un error tipográfico al verificarlo. – Steinar

6

Tengo este hecho con sustitución de cadenas ol llano fiesta :)

> echo $HOME 
/Users/fots 
> mypath="/Users/fots/some/cool/path" 
> echo ${mypath/$HOME/\~} 
~/some/cool/path 
+2

'mypath ="/Users/Users/fots '' lleva a '/ Users ~' ya que la sustitución de su comando no está anclada al frente de la ruta, sino que la reemplazará en cualquier lugar de la cadena. 'mypath =" Users/fotssss "' lleva a '~ sss' –

Cuestiones relacionadas