當前位置:首頁 » 操作系統 » linuxshell調用shell

linuxshell調用shell

發布時間: 2022-05-10 15:01:01

❶ 在linux下shell調用其他shell的問題

我在linux下測試了(下面x.sh調用y.sh),應該不會啊!
x.sh
#!/bin/sh
y.sh
echo "===="$?
for i in 1 2 3
do
sleep 1
echo "i="$i
done
=====================
y.sh
#!/bin/sh

echo "exit!"
exit 0

你用的是那種shell?在那種環境下運行?

❷ 如何運行linux shell程序

如何運行shell程序,如何在shell程序以及後續腳本中使用同一個變數,這些在工作中經常用到, 我找到如下的文章,再加深復習一下。
1 source命令用法:
source FileName
作用:在當前bash環境下讀取並執行FileName中的命令。該filename文件可以無"執行許可權"
註:該命令通常用命令「.」來替代。
如:source .bash_profile
. .bash_profile兩者等效。
source(或點)命令通常用於重新執行剛修改的初始化文檔。
source命令(從 C Shell 而來)是bash shell的內置命令。
點命令,就是個點符號,(從Bourne Shell而來)。
source的程序主體是bash,腳本中的$0變數的值是bash,而且由於作用於當前bash環境,腳本中set的變數將直接起效

2 sh, bash的命令用法:
sh/bash FileName

作用:打開一個子shell來讀取並執行FileName中命令。該filename文件可以無"執行許可權"

註:運行一個shell腳本時會啟動另一個命令解釋器.
每個shell腳本有效地運行在父shell(parent shell)的一個子進程里.
這個父shell是指在一個控制終端或在一個xterm窗口中給你命令指示符的進程.
shell腳本也可以啟動他自已的子進程.
這些子shell(即子進程)使腳本並行地,有效率地地同時運行腳本內的多個子任務.
在ubuntu中sh只是bash的一個鏈接。
由於是在子shell中執行,腳本設置的變數不會影響當前shell。

3 ./的命令用法:
./FileName
作用:打開一個子shell來讀取並執行FileName中命令。該filename文件需要"執行許可權"
註:運行一個shell腳本時會啟動另一個命令解釋器.
每個shell腳本有效地運行在父shell(parent shell)的一個子進程里.
這個父shell是指在一個控制終端或在一個xterm窗口中給你命令指示符的進程.
shell腳本也可以啟動他自已的子進程.
這些子shell(即子進程)使腳本並行地,有效率地地同時運行腳本內的多個子任務.
由於是在子shell中執行,腳本設置的變數不會影響當前shell。

4 export:
一個變數創建時,它不會自動地為在它之後創建的shell進程所知。而命令export可以向後面的shell傳遞變數的值。當一個shell腳本調用並執行時,它不會自動得到原為腳本(調用者)里定義的變數的訪問權,除非這些變數已經被顯式地設置為可用。export命令可以用於傳遞一個或多個變數的值到任何後繼腳本
5. 舉例
比如您在一個腳本里export $KKK=111 ,假如您用./a.sh執行該腳本,執行完畢後,您運行 echo $KKK ,發現沒有值,假如您用source來執行 ,然後再echo ,就會發現KKK=111。因為調用./a.sh來執行shell是在一個子shell里運行的,所以執行後,結構並沒有反應到父shell里,但是 source不同他就是在本shell中執行的,所以能夠看到結果.
小測試
1 建立test.sh
#!/bin/bash
export s=/home/jboss/
2 執行命令: source test.sh
echo $s
結果輸出: /home/jboss/
3 新開個shell
執行命令: ./test.sh
echo $s
結果: 沒有輸出s值

結論:
1、執行腳本時是在一個子shell環境運行的,腳本執行完後該子shell自動退出。
2、一個shell中的系統環境變數才會被復制到子shell中(用export定義的變數);
3、一個shell中的系統環境變數只對該shell或者它的子shell有效,該shell結束時變數消失(並不能返回到父shell中)。3、不用 export定義的變數只對該shell有效,對子shell也是無效的。

直接執行一個腳本文件是在一個子shell中運行的,而source則是在當前shell環境中運行的。
source可以讓腳本影響它們的父shell環境,這和export去影響子shell環境相反.

❸ linux下如何用c語言調用shell命令

可以使用system函數調用。
system("shell_command");
可以實現在shell中調用shell_command的作用。
比如設置網卡IP為192.168.1.100,可以寫作
system("ifconfig
eth0
192.168.1.100");

❹ LINUX中如何使用Shell,我剛用,都沒找到地方

所謂的shell就是終端。
點從這里開始--系統工具--新建終端。
或者在XWIDOWS桌面裡面直接點右鍵,在右鍵菜單中點新建終端。
我指的是redhatlinux g桌面系統。

❺ 如何調用linux系統的shell

你這挺怪,你ssh連接到另一台linux,看到的就是這機器的shell了,你要給這個用戶帳號指定個shell,用nolongin自然就沒了。
這么說吧,你用putty登陸到linux,看到的就是linux的shell了,帳號shell要先給,這個是在/etc/passed里寫的,
不知道你是不是問的這個

❻ linux下怎樣用c語言調用shell命令

C程序調用shell腳本共同擁有三種法子 :system()、popen()、exec系列數call_exec1.c ,
system() 不用你自己去產生進程。它已經封裝了,直接增加自己的命令
exec 須要你自己 fork 進程,然後exec 自己的命令

popen() 也能夠實現運行你的命令,比system 開銷小

方法一、system()的使用。我直接上代碼吧

int system(const char *command);

我在/home/book/shell新建一個test.sh文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#!bin/bash
echo $HOME
echo "the is test!"</span></span>

test.c文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#include<stdlib.h>

int main()
{
system("bash /home/book/shell/test.sh"); /* chmod +x test.sh ,路徑前面要加上bash */
return 0;
}</span></span>

運行例如以下命令來編譯
<span style="font-size:18px;">gcc test.c -o test
</span>

測試命令:

<span style="font-size:18px;">./test</span>

結果例如以下:

<span style="font-size:18px;">/root
the is test!</span>

方法二:popen() 會調用fork()產生 子歷程,然後從子歷程中調用/bin/sh -c來履行 參數command的指令。參數type可應用 「r」代表讀取。「w」代表寫入。遵循此type值。popen()會建立 管道連到子歷程的標准 輸出設備 或標准 輸入設備 ,然後返回一個文件指針。
隨後歷程便可利用 此文件指針來讀取子歷程的輸出設備 或是寫入到子歷程的標准 輸入設備 中。此外,全部應用 文 件指針(FILE*)操作的函數也都能夠應用 ,除了fclose()以外。

返回值:若成功 則返迴文件指針,否則返回NULL,差錯 原因存於errno中。注意:在編寫具SUID/SGID許可權的程序時請盡量避免應用 popen()。popen()會繼承環境變數。通過環境變數可能會造成系統安全的問題

FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

其它不用改變我們直接改動test.c文件:

#include<stdio.h>
int main()
{
char buffer[80];
FILE *fp=popen("bash /home/book/shell/test.sh","r");
fgets(buffer,sizeof(buffer),fp);
printf("%s",buffer);
pclose(fp);
return 0;
}

方法三:exec函數簇 (我不太懂,別人的。也沒有驗證。習慣方法一)
須要注意的是exec並非1個函數, 事實上它僅僅是一組函數的統稱, 它包含以下6個函數:

#include <unistd.h>

int execl(const char *path, const char *arg, ...);

int execlp(const char *file, const char *arg, ...);

int execle(const char *path, const char *arg, ..., char *const envp[]);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execve(const char *path, char *const argv[], char *const envp[];

能夠見到這6個函數名字不同, 並且他們用於接受的參數也不同.
實際上他們的功能都是幾乎相同的, 由於要用於接受不同的參數所以要用不同的名字區分它們, 畢竟c語言沒有函數重載的功能嘛..

可是實際上它們的命名是有規律的:
exec[l or v][p][e]

exec函數里的參數能夠分成3個部分, 運行文件部分, 命令參數部分, 環境變數部分.
比如我要運行1個命令 ls -l /home/gateman

運行文件部分就是 "/usr/bin/ls"
命令參賽部分就是 "ls","-l","/home/gateman",NULL 見到是以ls開頭 每1個空格都必須分開成2個部分, 並且以NULL結尾的啊.
環境變數部分, 這是1個數組,最後的元素必須是NULL 比如 char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};

好了說下命名規則:
e興許, 參數必須帶環境變數部分, 環境變零部分參數會成為運行exec函數期間的環境變數, 比較少用
l 興許, 命令參數部分必須以"," 相隔, 最後1個命令參數必須是NULL
v 興許, 命令參數部分必須是1個以NULL結尾的字元串指針數組的頭部指針. 比如char * pstr就是1個字元串的指針, char * pstr[] 就是數組了, 分別指向各個字元串.

關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html

p興許, 運行文件部分能夠不帶路徑, exec函數會在$PATH中找

還有1個注意的是, exec函數會代替運行它的進程, 也就是說, 一旦exec函數運行成功, 它就不會返回了, 進程結束. 可是假設exec函數運行失敗, 它會返回失敗的信息, 並且進程繼續運行後面的代碼!

通常exec會放在fork() 函數的子進程部分, 來替代子進程運行啦, 運行成功後子程序就會消失, 可是運行失敗的話, 必須用exit()函數來讓子進程退出!

❼ linux內核模塊中調用shell腳本

內核模塊是用C語言寫的,如果你想開機啟動腳本,可以將shell路徑寫在profile文件中

❽ Linux調用iptables Shell調用

如果你的網站是php的話應該可以實現
$ip=$_POST("ip")//這里獲取你輸入的ip地址,當然可以對ip地址格式進行判斷,這里略過
system("你調用寫好的腳本文件,必須有可執行許可權")
比如你要刪除一個文件
system("/bin/rm -rf $filename")
命令或者腳本都要完整路徑

至於郵件也可以用system實現,你是要發送的你linux下的郵箱,還是其他比如163郵箱?請說清楚

具體命令是http://nxcom.vicp.net/?post=13

某個ip的上網記錄無法用iptables來獲取,只能獲取某個ip訪問的80埠
的信息

這里你必須寫好iptables
iptables -A OUTPUT -s 192.168.1.100 -p tcp --dport 80 -j LOG
把符合上面的規則保存到某個日誌文件中,然後讀取即可

❾ 在linux下調用shell,是同步還是非同步

系統調用是程序的事情 shell是人機介面,是你輸入命令的地。 這兩個完全無關。 你在shell裡面輸入命令,shell會根據你的命令執行程序, 執行的程序有可能調用系統的功能。

❿ linux系統調用 shell命令 c庫函數怎麼區分

首先,命令應該是好和其他兩個區分開來的了,因為命令都是可以直接敲在shell上面回車執行的,而系統調用和庫函數都不行;
其次,Linux系統調用和C庫函數都是函數的形式,即都是「func(args)」的形式,但系統調用是
由系統內核對外提供的服務介面;C庫函數和你自己寫的普通的函數沒有本質的區別,只是在C標准庫中而已,Linux上面glibc就是C函數庫。從表面上看兩者不太好區分,不過,你可以從它們需要包含的頭文件來區分,C庫函數像printf在<stdio.h>中,std就是標准(standard)的縮寫形式,因此在<stdxxx.h>中的函數,基本都是C庫函數;像 ssize_t read(int fd, void *buf, size_t count);這樣很多的系統調用是包含在<unistd.h>中的,unistd意思是UNIX Standard,從這個意義就可以區分了。

希望對你有所幫助,如還有問題,可隨時聯系我:-)

熱點內容
死歌腳本 發布:2024-10-09 03:11:55 瀏覽:85
企業內網搭建電影伺服器侵權嗎 發布:2024-10-09 03:07:14 瀏覽:105
python讀取jpg 發布:2024-10-09 02:50:22 瀏覽:154
王者榮耀的伺服器ip在哪 發布:2024-10-09 02:44:48 瀏覽:77
安卓怎麼下載李寧 發布:2024-10-09 02:31:37 瀏覽:343
配置不高pr哪個版本最好用 發布:2024-10-09 01:57:15 瀏覽:789
編譯OpenWrtipv6 發布:2024-10-09 01:51:40 瀏覽:124
python寫入位元組 發布:2024-10-09 01:24:22 瀏覽:648
如何設置超高難度密碼 發布:2024-10-09 01:19:05 瀏覽:178
linux只讀文件修改 發布:2024-10-09 01:13:08 瀏覽:87