banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Tại sao export command không làm việc đúng trong shell script  XML
  [Question]   Tại sao export command không làm việc đúng trong shell script 05/05/2013 23:14:44 (+0700) | #1 | 275475
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Em được biết export command trong linux sẽ làm cho các biến trong parent process được nhìn thấy trong các sub process.

Em thử trong terminal:
Code:
export test=123
bash
echo $test


thì ra kết quả 123

Nhưng khi thử trong shell script
Code:
#!/bin/bash
export test=123
bash
echo $test


thì không thấy gì cả

Tại sao lại xảy ra hiện tượng đó ạ ? Mong mọi người giải đáp giúp ạ.
[Up] [Print Copy]
  [Question]   Tại sao export command không làm việc đúng trong shell script 06/05/2013 07:57:25 (+0700) | #2 | 275485
[Avatar]
quangteospk
Member

[Minus]    0    [Plus]
Joined: 20/10/2009 04:05:30
Messages: 123
Offline
[Profile] [PM]
Viết cái shell script mà không thực thi nó thì những command trong shell script đó có tác dụng gì?
Jazz
[Up] [Print Copy]
  [Question]   Tại sao export command không làm việc đúng trong shell script 08/05/2013 05:36:47 (+0700) | #3 | 275549
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Tất nhiên là chạy shell rồi chứ smilie
[Up] [Print Copy]
  [Question]   Tại sao export command không làm việc đúng trong shell script 08/05/2013 06:49:07 (+0700) | #4 | 275550
Stanley_00
Member

[Minus]    0    [Plus]
Joined: 01/03/2011 06:21:38
Messages: 74
Offline
[Profile] [PM]
Cái shell script của bạn chạy tới lệnh thứ hai (bash) thì nó mở thêm một cái shell khác rồi, nó có chạy được tới lệnh echo đâu mà hiện ra cái gì được...
[Up] [Print Copy]
  [Question]   Tại sao export command không làm việc đúng trong shell script 08/05/2013 21:45:12 (+0700) | #5 | 275578
[Avatar]
quangteospk
Member

[Minus]    0    [Plus]
Joined: 20/10/2009 04:05:30
Messages: 123
Offline
[Profile] [PM]

explorer88 wrote:
Tất nhiên là chạy shell rồi chứ smilie 


Chạy cái script đó mà "không thấy gì" á smilie

Code:
#!/bin/bash
export test=123
echo $test


vầy là đủ, thêm bash làm gì. Kể cả khi gõ trong Terminal cũng vậy, chỉa cần export rồi echo là đc, đâu cần thêm command bash làm gỉ?
Jazz
[Up] [Print Copy]
  [Question]   Tại sao export command không làm việc đúng trong shell script 08/05/2013 21:55:34 (+0700) | #6 | 275580
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
@quangteospk: bạn chưa hiểu câu hỏi của explorer88 rồi.

@explorer88: bạn thử sửa lại thành thế này xem:
Code:
#!/bin/bash
export test=123
bash -c "echo $test"
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Tại sao export command không làm việc đúng trong shell script 08/05/2013 23:20:55 (+0700) | #7 | 275584
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]
Em cám ơn Stanley_00 và anh quanta

Em hiểu rồi
Code:
#!/bin/bash
export test=123
bash
echo $test


không hoạt động vì lệnh bash sẽ mở ra một sub bash shell mới tại đó nó đợi nhập command từ người dùng. Bằng chứng là khi em chạy script đó: không có hiện tượng gì xảy ra nhưng khi gõ exit để thoát sub bash shell đó thì biến test được in ra nhưng lúc này biến test lại được in ra trong parent shell script nên không thể dùng đoạn shell script trên để kiểm tra được tính chất của export command.

Tham khảo ý của Stanley_00 và anh quanta thì em đã sửa lại và test được tính chất export command như sau:

Em viết hai shell script đặt trong cùng thư mục: test1.sh và test2.sh

test1.sh
Code:
#!/bin/bash
export test=123
bash "test2.sh" # lệnh tương đương sh "test2.sh"


test2.sh
Code:
#!/bin/bash
echo "$test"


test trong hai trường hợp có và không dùng export command thấy đúng như lý thuyết luôn

Còn theo hướng dẫn của anh quanta sử dụng one-line bash script trực tiếp không cần đến test2.sh nữa thì
#!/bin/bash
export test=123
bash -c 'echo $test'

cũng cho ra kết quả đúng như lý thuyết nhưng có một điểm lạ là string đằng sau bash -c phải đặt trong single quote chứ nếu đặt trong double quote dù có export hay không có export thì giá trị test vẫn được in ra. Em đang dùng bash shell version 4.2.24(1)-release (i686-pc-linux-gnu).
[Up] [Print Copy]
  [Question]   Tại sao export command không làm việc đúng trong shell script 09/05/2013 09:36:18 (+0700) | #8 | 275602
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

explorer88 wrote:

...
sử dụng one-line bash script trực tiếp không cần đến test2.sh nữa thì
#!/bin/bash
export test=123
bash -c 'echo $test'

cũng cho ra kết quả đúng như lý thuyết nhưng có một điểm lạ là string đằng sau bash -c phải đặt trong single quote chứ nếu đặt trong double quote dù có export hay không có export thì giá trị test vẫn được in ra. Em đang dùng bash shell version 4.2.24(1)-release (i686-pc-linux-gnu). 

Có khi nào `test` env variable vẫn đang có giá trị là "123" do bạn chạy `export` từ ngoài command line từ trước rồi không.

Thử tìm hiểu xem: với bash, single quotes với double quotes khác nhau như nào.
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Tại sao export command không làm việc đúng trong shell script 09/05/2013 14:40:24 (+0700) | #9 | 275606
explorer88
Member

[Minus]    0    [Plus]
Joined: 06/11/2010 22:32:47
Messages: 75
Offline
[Profile] [PM]

quanta wrote:

explorer88 wrote:

...
sử dụng one-line bash script trực tiếp không cần đến test2.sh nữa thì
#!/bin/bash
export test=123
bash -c 'echo $test'

cũng cho ra kết quả đúng như lý thuyết nhưng có một điểm lạ là string đằng sau bash -c phải đặt trong single quote chứ nếu đặt trong double quote dù có export hay không có export thì giá trị test vẫn được in ra. Em đang dùng bash shell version 4.2.24(1)-release (i686-pc-linux-gnu). 

Có khi nào `test` env variable vẫn đang có giá trị là "123" do bạn chạy `export` từ ngoài command line từ trước rồi không.

Thử tìm hiểu xem: với bash, single quotes với double quotes khác nhau như nào. 


Em tìm hiểu thì biết: Double quote sẽ cho phép bash diễn dịch các ký tự đặc biệt như $ * @ trong string. Còn single quote sẽ ngăn cản sự diễn dịch của bash lên các ký tự đặc biệt đó. Thay vì phải dùng backslash character để escape các ký tự đặc biệt này trong double quote thì chỉ cần bao ngoài string bằng single quote.

Em đã chạy thử lại ví dụ với double quote
Code:
#!/bin/bash
export test=123
bash -c "echo $test"


Nhưng kết quả vẫn thế giá trị biến test được in ra dù có hay không có được export. Em bèn sửa lại:
Code:
#!/bin/bash
export test=123
echo "pid of parent shell = $$"
bash -c "echo pid of new shell = $$ and value of test var = $test"


Kết quả là lúc nào pid của new shell cũng trùng với pid của parent shell. Em kết luận là trước khi mở một sub process cho new shell này, parent shell đã thực hiện diễn dịch đoạn string thành 'echo pid of new shell = 1234 and value of test var = 123'. Đoạn string mới này khi đi vào new shell sẽ cứ thế được in ra vì chẳng còn ký tự đặc biệt nào để diễn dịch cả. Cũng vì được parent shell diễn dịch trước đó rồi nên giá trị test lúc nào cũng được in dù có hay không có được export.

Em thử đoạn script với single quote:
Code:
#!/bin/bash
export test=123
echo "pid of parent shell = $$"
bash -c 'echo pid of new shell = $$ and value of test var = $test'


Thì kết quả cho ra pid của new shell khác với pid của parent shell. Lúc này em nghĩ parent shell sẽ không diễn dịch được đoạn string sau bash -c vì nó được bao bởi single quote nên lúc này đoạn string đó đi vào new shell mới được diễn dịch nên có pid của new shell và khi đó biến test cũng được in chỉ khi nào được export.

Chà có mỗi cái thử nghiệm hiệu lực của export thôi mà dính mắc đến lắm thứ thật smilie

Em cám ơn mọi người đã giúp đỡ ạ.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|