2016-03-21 23 views
1

olarak ayarlanmayı engelliyorsa, G/Ç'deki çeşitli yapılara ("if" ve "while" gibi) giriş ve çıkışları yönlendirebileceğinizi okudum. Bunu denediğimde, bir "|" kullanarak farkettim. eğer bir yapının sonunda, eğer yapının ifşa edilmesinden sonra üzerine yazdığım herhangi bir değişkeni önledi; ama bunun yerine ">" kullanırsam, o zaman değişken modifikasyonlar geçerli olur. Ben eğer yapıdan stdout'u yönlendirme ediyorum nasıl tek fark'|' kullanma Bash'in yapılandırması, değişken

VAR_0: Unmodified 
VAR_1: Changed 

Not: 64 bit Linux üzerinde Bash sürümü 4.3.11 Running

#!/bin/bash 

VAR_0='Unmodified' 

if true 
then 
    VAR_0='Changed' 
fi | cat 

echo "VAR_0: $VAR_0" 

########### 

VAR_1='Unmodified' 

if true 
then 
    VAR_1='Changed' 
fi > tmpFile 
rm tmpFile 

echo "VAR_1: $VAR_1" 

şu çıktıyı üretir. "|" Neden VAR_0'ın değiştirilmesinin engellenmesi?

cevap

0

Bu durum, boru hatlarının altkutları kullanması nedeniyle oluşur; cat no'lu boru hattına bağlayarak, bir alt kabukta ilk if-then bloğunu yürütürsünüz. Bu nedenle, VAR_0='Changed' değiştirildi, ancak yalnızca alt kabukta.

deneyin: Bir dosya (">") yönlendiriliyor

#!/bin/bash 

VAR_0='Unmodified' 

if true 
then 
    VAR_0='Changed' 
    echo "VAR_0: $VAR_0" 
fi | cat 

echo "VAR_0: $VAR_0" 

değil bir altkabuk oluşturmak yapar; Böylece bu değişken devam eder.

1

TL; DR

atın Bash FAQ 24. Sorunuzu, verilen örneklerle birlikte yanıtlar!


Sen sırayla onun değişkenlerle birlikte atılmadan bir SubShell ebeveyn kabuğun kopya oluşturmuş olursunuz.

örnek olarak aşağıdaki ortak hata atın:

var=0 
some-command | while read -r line; do 
    printf 'var value inside subshell is: %s\n' "$((++var))" 
done 
printf 'But in the parent shell it stays: %s\n' "$var" 

Çıktı: bu behvior arzu edilmez

var value inside subshell is: 1 
But in the parent shell it stays: 0 

, çözüm güncellenen varaibles tutmak için Process Substitution kullanmak genellikle . Yani, bizim durumumuzda biz aşağıdakileri yapın (ya da Bash FAQ 24 genellikle görülebilir):

var=0 
while read -r line; do 
    printf 'var value inside subshell is: %s\n' "$((++var))" 
done < <(some-command) 
printf 'And it stays the same: %s\n' "$var" 

Çıktı:

var value inside subshell is: 1 
And it stays the same: 1