<![CDATA[Latest posts for the topic "Tại sao export command không làm việc đúng trong shell script"]]> /hvaonline/posts/list/24.html JForum - http://www.jforum.net Tại sao export command không làm việc đúng trong shell script 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 ạ.]]>
/hvaonline/posts/list/44688.html#275475 /hvaonline/posts/list/44688.html#275475 GMT
Tại sao export command không làm việc đúng trong shell script /hvaonline/posts/list/44688.html#275485 /hvaonline/posts/list/44688.html#275485 GMT Tại sao export command không làm việc đúng trong shell script /hvaonline/posts/list/44688.html#275549 /hvaonline/posts/list/44688.html#275549 GMT Tại sao export command không làm việc đúng trong shell script /hvaonline/posts/list/44688.html#275550 /hvaonline/posts/list/44688.html#275550 GMT Tại sao export command không làm việc đúng trong shell script

explorer88 wrote:
Tất nhiên là chạy shell rồi chứ :| 
Chạy cái script đó mà "không thấy gì" á :-O 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ỉ?]]>
/hvaonline/posts/list/44688.html#275578 /hvaonline/posts/list/44688.html#275578 GMT
Tại sao export command không làm việc đúng trong shell script Code:
#!/bin/bash
export test=123
bash -c "echo $test"
]]>
/hvaonline/posts/list/44688.html#275580 /hvaonline/posts/list/44688.html#275580 GMT
Tại sao export command không làm việc đúng trong shell script 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).]]>
/hvaonline/posts/list/44688.html#275584 /hvaonline/posts/list/44688.html#275584 GMT
Tại sao export command không làm việc đúng trong shell script

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.]]>
/hvaonline/posts/list/44688.html#275602 /hvaonline/posts/list/44688.html#275602 GMT
Tại sao export command không làm việc đúng trong shell script

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 :D Em cám ơn mọi người đã giúp đỡ ạ.]]>
/hvaonline/posts/list/44688.html#275606 /hvaonline/posts/list/44688.html#275606 GMT