2
votes

bash équivalent aux modificateurs tcsh pour l'extraction des composants de chemin

Dans tcsh, je peux extraire le deuxième élément de chemin de la fin du chemin en suivant la méthode

cd /some/long/directory/structure/path/
set x=`pwd`
echo ${x:h:h:t}
directory

Comment puis-je faire la même chose dans bash?

Je veux dire, est-ce bash ont aussi ce genre de modificateurs?


5 commentaires

Ceci est très étroitement lié, sinon carrément duplicatif, de Comment obtenir le nom de l'avant-dernier dossier sous Linux ou Comment obtenir la dernière partie de dirname dans bash .


@CharlesDuffy Ce n'est pas le cas. Cette question concerne les modificateurs et non "comment extraire l'élément de n du chemin"


Cependant, ces "modificateurs" (dans bash, ils sont tous appelés expansion des paramètres formulaires) sont tous des sous-ensembles de moyens pour atteindre votre objectif. Ainsi, les entrées de questions-réponses préexistantes liées ci-dessus font les discuter - voir cette réponse pour un exemple .


Et franchement, si vous limitez votre réponse de "comment puis-je faire X en bash?" à "comment faire X en bash en utilisant un analogue direct à la syntaxe Y?", je me demande si cette question est de nature pratique , comme l'exige notre définition sur le sujet . (Si vous savez que a signifie faire X, il est juste d'en demander un plus rapide ou plus rapide, mais un autre qui est différent simplement parce que ... eh bien, quel est le point pratique?)


@CharlesDuffy ... et franchement, oui Charles, cette question est très pratique. Sinon, je ne l'ai pas demandé :-). Merci à jhnc, chepner et de nombreux autres utilisateurs de stackoverflow qui ont publié la solution et qui n'ont pas essayé de montrer à quel point ils sont "intelligents" par rapport à "notre définition de sujet". Les gars - vous m'avez vraiment aidé. Merci beaucoup!


3 Réponses :


0
votes
cd /some/long/path/somewhere
x=$PWD
basename "$(dirname "$x")"
>  path
dirname gets the absolute path of the parent folder of the argument. basename gets the name of the argument.Edit: remembered the much better way than I was doing before.

4 commentaires

$ PWD ne devrait pas avoir de barres obliques à la fin. Si c'est le cas, y = $ {x %% /} en supprimera tout. Cela vaut peut-être la peine d'annoter dans votre réponse ce qui équivaut à : h et ce qu'il faut : t


@jhnc, s'est souvenu d'une meilleure façon


Vous voulez dire basename "$ (dirname" $ ​​x ")" , non? Juste x ne regarde pas la valeur de la variable, et sans les guillemets, les noms de répertoire avec des espaces se comportent mal.


ce n'est pas vraiment bash cependant. pourrait tout aussi bien le nourrir en perl si vous voulez le faire de cette façon. : p



3
votes

Les modificateurs de style csh peuvent être utilisés avec l'expansion de l'historique (sans surprise, car l'expansion de l'historique a été empruntée à csh ).

$ cd /some/long/directory/structure/path/
$ echo !!:1:h:h:t
echo directory
directory

!!: 1 sélectionne le mot 1 (à partir de zéro) de la commande précédente, donc l'argument de cd.

( echo Le répertoire apparaît sur l'erreur standard car le shell affiche par défaut le résultat de l'expansion de l'historique avant d'exécuter réellement la commande résultante.)


1 commentaires

Existe-t-il un moyen d'obtenir cette sortie sans erreur standard ou dois-je utiliser une astuce de redirection?



2
votes

Dans un script bash non interactif, les commandes d'expansion de l'historique comme dans la réponse de @ chepner ne seront normalement pas disponibles. Cependant, vous avez des extensions de paramètres comme:

$ cd /some/long//directory///structure/path/
$ set x=$(pwd)
$ echo $x
/some/long/directory/structure/path
$ y=${y%/*/*}      # each /* is equivalent to one :h
$ y=${y##*/}       # equivalent to :t
$ echo $y
directory


1 commentaires

L'expansion de l'historique n'est pas une édition de ligne et peut être activée pour les shells non interactifs (bien que je ne le recommande pas).