Como posso ler nomes de caminho em um arquivo linha por linha e aplicar pushd em cada nome de caminho? [duplicado]

0

Eu tenho um arquivo /tmp/pathnames , onde cada linha é um nome de caminho para um diretório.

/tmp/my dir1
/tmp/dir2
/tmp/dir3

Eu quero aplicar o comando pushd a cada linha no arquivo, para que eu possa ter esses nomes de caminho na pilha dir do shell atual.

Aqui está um script bash para essa finalidade:

#! /bin/bash

cat /tmp/pathnames | while read pathname; do
    pushd "$pathname"
done

Mas não funciona como eu esperava, ou seja, nenhuma pilha de diretórios é criada para o meu shell atual.

Mesmo se eu executar os comandos no script no shell diretamente com source , ele ainda não funcionará.

Eu me pergunto por que e como resolver o problema?

Obrigado.

    
por Tim 12.01.2018 / 16:45

1 resposta

2

Este é essencialmente o mesmo problema que Por que o array vazio após o loop while? isto é (independentemente de você estar ou nãosource), o pushd está ocorrendo em um subshell diferente.

Contraste

$ cat pathnames | while read pathname; do pushd "$pathname"; dirs -v; done
/tmp/my dir1 ~
 0  /tmp/my dir1
 1  ~
/tmp/dir2 /tmp/my dir1 ~
 0  /tmp/dir2
 1  /tmp/my dir1
 2  ~
/tmp/dir3 /tmp/dir2 /tmp/my dir1 ~
 0  /tmp/dir3
 1  /tmp/dir2
 2  /tmp/my dir1
 3  ~
$
$ dirs -v
 0  ~

com

$ while read pathname; do pushd "$pathname"; dirs -v; done < pathnames
/tmp/my dir1 ~
 0  /tmp/my dir1
 1  ~
/tmp/dir2 /tmp/my dir1 ~
 0  /tmp/dir2
 1  /tmp/my dir1
 2  ~
/tmp/dir3 /tmp/dir2 /tmp/my dir1 ~
 0  /tmp/dir3
 1  /tmp/dir2
 2  /tmp/my dir1
 3  ~
$
$ dirs -v
 0  /tmp/dir3
 1  /tmp/dir2
 2  /tmp/my dir1
 3  ~
$
    
por 12.01.2018 / 18:29

Tags