Tập lệnh Shell để đặt các biến môi trường


82

Tôi muốn viết một tập lệnh shell để xuất các biến.

Dưới đây tôi đã liệt kê kịch bản.

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

Nhưng điều này dường như không hoạt động đúng. Thay vào đó, tôi phải thực hiện từng lệnh tại dấu nhắc trình bao.


Bạn đang sử dụng trình bao nào (ví dụ: bash, ksh, sh)
Tom

có thể trùng lặp của Lưu toàn cầu biến BASH
tripleee


Câu trả lời:


48

Vui lòng cho chúng tôi xem các phần khác của tập lệnh và cho chúng tôi biết bạn phải thực hiện các lệnh riêng lẻ nào và muốn thực hiện đơn giản.

Trong khi đó, bạn phải sử dụng dấu ngoặc kép chứ không phải dấu nháy đơn để mở rộng các biến:

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

Dấu chấm phẩy ở cuối một lệnh cũng không cần thiết.

Cho đến nay:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

subạn có thể chạy nó với:

su -c 'sh /path/to/script.sh'

Lưu ý: OP đã không yêu cầu rõ ràng các bước về cách tạo biến xuất trong một trình bao tương tác bằng cách sử dụng tập lệnh shell. Anh ấy chỉ yêu cầu kịch bản của mình được thẩm định nhiều nhất. Anh ấy không đề cập chi tiết về cách sử dụng kịch bản của mình. Nó có thể được sử dụng .hoặc sourcetừ shell tương tác. Nó có thể là một scipt độc lập, hoặc nó có thể là sourcetừ một tập lệnh khác. Các biến môi trường không đặc trưng cho các trình bao tương tác. Câu trả lời này đã giải quyết vấn đề của anh ấy.


1
Xin chào konsolebox !! Cảm ơn rât nhiều . nhưng tôi không hiểu sự khác biệt .. xuất PATH = "/ home / linux / Practice / linux-devkit / bin /: $ PATH" trong dấu ngoặc kép. & xuất CROSS_COMPILE = '/ home / linux / Practice / linux-devkit / bin / arm-arago-linux-gnueabi-' trong dấu nháy đơn. kịch bản được sửa đổi bởi u hoạt động tốt.
Prag Rao

Việc mở rộng @PragRao Paramater chỉ đơn giản là không xảy ra trong các dấu ngoặc kép. Bạn có thể giải thích chi tiết về việc trích dẫn thêm ở đây .
konsolebox 14/09/13

3
Tên câu hỏi @konsolebox nghe giống như "Tập lệnh Shell để đặt các biến môi trường" - phần lớn cộng đồng tìm thấy câu hỏi này chỉ để giải quyết vấn đề chạy loại tập lệnh này từ ( sourcehoặc .) trình bao hiện tại . Tôi đánh giá cao việc bạn trả lời chính xác câu hỏi của OP, nhưng tôi đã tìm thấy chủ đề này từ google và câu trả lời tiếp theo đã giúp tôi nhiều hơn câu trả lời của bạn. Upvotes cho câu trả lời thứ hai (với source.khẳng định quan điểm của tôi ...
avtomaton

@avtomaton Một lần nữa, không phải về những người khác tìm thấy nó trên Google. Nó chỉ là về cách tiếp cận ban đầu của câu hỏi. Nếu bạn lo lắng về cách thay đổi câu hỏi hoặc cách trình bày câu trả lời, hãy cân nhắc thảo luận về nó trong meta.
konsolebox,

226

Bạn cần chạy script dưới dạng sourcehoặc tốc ký.

source ./myscript.sh

hoặc là

. ./myscript.sh

Điều này sẽ chạy trong trình bao hiện có, đảm bảo bất kỳ biến nào được tạo hoặc sửa đổi bởi tập lệnh sẽ có sẵn sau khi tập lệnh hoàn thành.

Việc chạy tập lệnh chỉ sử dụng tên tệp sẽ thực thi tập lệnh trong một vỏ con riêng biệt.


2
bằng cách sử dụng nguồn ./setenv.sh -: Đưa ra lỗi không tìm thấy nguồn. và bằng cách sử dụng. ./setenv.sh nó cung cấp không thể mở setenv.sh. Bạn có thể vui lòng giúp tôi về điều này. Cảm ơn
Vishal

1
đã gãi đầu trong một giờ tại sao những vars xuất chết tiệt đó không có (zsh) đã thử typeset -gx, xuất khẩu, v.v. và đang có wtf của tôi? thời điểm và chưa - không biết rằng một vỏ con được thực thi với phạm vi riêng của nó. nhờ từ tiết kiệm ngày của tôi từ sắp xảy ra tức giận bỏ lỡ quản lý
Không thể hoạt động

1

Chạy tập lệnh dưới dạng nguồn = để chạy ở chế độ gỡ lỗi.

source= ./myscript.sh

0

Tôi không thể giải quyết nó với source ./myscript.sh. Nó báo lỗi không tìm thấy nguồn.
Cũng không thành công khi sử dụng . ./myscript.sh. Nó không thể mở myscript.sh.

Vì vậy, tùy chọn của tôi là đặt nó trong một tệp văn bản để được gọi trong tập lệnh tiếp theo.

#!/bin/sh
echo "Perform Operation in su mode"
echo "ARCH=arm" >> environment.txt
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Tnen gọi nó bất cứ khi nào cần thiết:

while read -r line; do
    line=$(sed -e 's/[[:space:]]*$//' <<<${line})
    var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
    if [ -z "$(test)" ];then eval export "$line";fi
done <environment.txt

1
Bạn có thể sửa đổi myscript.shđể nó tạo ra một tệp được gọi environment.sh(với các câu lệnh xuất), sau đó chỉ cần nguồn environment.shthay vì vòng lặp while bất cứ khi nào cần thiết.
slavejma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.