Question

J'écris un utilitaire simple de ligne de commande bac à sable rubis pour copier et décompresser des répertoires d'un système de fichiers distant dans un répertoire de zéro local afin de les dézipper et permettent aux utilisateurs de modifier les fichiers. J'utilise Dir.mktmpdir comme le répertoire par défaut zéro, ce qui donne un chemin vraiment moche (par exemple: / var / dossiers / zz / zzzivhrRnAmviuee +++ 1VE +++ ans / -Tmp- / d20100311-70034-abz5zj)

Je voudrais la dernière action de la copie et dézipper script shell cd l'appelant dans le nouveau répertoire de zéro afin que les gens peuvent y accéder facilement, mais je ne peux pas comprendre comment changer le PWD de l'appel coquille. Une possibilité est d'avoir l'utilitaire imprimer le nouveau chemin vers la sortie standard, puis exécutez le script dans le cadre d'un sous-shell (c.-à-cd $(sandbox my_dir)), mais je veux imprimer des progrès sur la copie et dézipper car il peut prendre jusqu'à 10 minutes, cela ne fonctionnera pas. Dois-je juste aller à un pré-déterminé, répertoire de travail facile à trouver? Quelqu'un at-il une meilleure suggestion? Merci d'avance pour votre aide. -Erik

Était-ce utile?

La solution

Vous pourriez mourir dans une nouvelle coque qui se trouve à votre zéro dir, mais je vais avoir du mal à comprendre le point de tout cela. Si vos utilisateurs vont modifier ces fichiers, alors je suppose qu'ils veulent soit pour les garder ou vous projetez sur travailler avec les fichiers modifiés. Dans le premier cas, mettre les fichiers dans un endroit sensible et vous ne serez pas à vous soucier de vos utilisateurs de les trouver (répertoire de travail). Dans le second cas, frayer un sous-shell pour vos utilisateurs qui se trouve dans le répertoire zéro et leur demander de modifier les fichiers. Lorsque le sous-shell sort, vous pouvez continuer à traiter vos fichiers du même programme rubis.

Autres conseils

Un processus ne peut pas changer l'environnement de son processus parent, vous devrez donc faire une action dans le parent.

Vous pouvez avoir vos utilisateurs la source d'un script shell, et ce script appelle le programme rubis et de quelque part de cd. Lorsque vous utilisez la commande source de votre shell (ou . source), qui affecte le processus en cours.

, notes glenn jackman, un processus enfant ne peut pas changer son répertoire de travail des parents (ou des variables d'environnement, etc.). À moins que vous comptez violer le processus parent avec un débogueur ...

Un processus exécuté dans le cadre d'une substitution de commande peut écrire sur stderr pour fournir une sortie à l'utilisateur alors que la sortie de stdout est capturé par la substitution de commande:

cd "$(sandbox whatever)"

bac à sable commande envoie la plupart de sa sortie à stderr, et juste la finale « répertoire pour CHDIR à » stdout. Si bac à sable est un script shell, vous pouvez le faire comme ceci:

#!/bin/sh
newdir="$(mktemp -dt sandobox)"
{
# do whatever, in a sub-shell
# use a group command (or change the braces to parens to use a sub-shell) to
# capture all stdout and send it to stderr 
} 1>&2
echo "$newdir"

Je suis sûr équivalent quelque chose pourrait se faire en Ruby.

Créez votre répertoire temporaire de votre script shell d'emballage d'abord et ensuite passer comme un argument de ligne de commande à votre script Ruby.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top