深入Linux命令行——Linux与开发环境
深入Linux命令行
让我们深入探讨Linux命令行,涵盖你提到的常用命令、文件权限、进程管理以及Shell脚本编写。(文章只适用于初学者)
一、常用命令
-
grep
grep
常用于搜索文件内容。#小知识:查询正在运行的进程:ps -aux | grep 进程名称 #或者命令pgrep 进程名称,名称可tab grep "pattern" filename grep -r "pattern" /path/to/directory #递归搜索 grep -n "pattern" filename #显示行号 grep -i "pattern" filename #忽略大小写
-
sed
sed
用于流编辑。sed 's/old/new/g' filename #替换文本 sed -n '1,5p' filename #打印第1行到第5行 sed 'pattern/d' filename #删除包含pattern的行
-
awk
awk
用于文本处理。awk '{print $1}' filename #打印每行第一个字段 awk '/pattern/ {print}' filename #打印包含pattern的行 awk '{sum+=$1} END {print sum}' filename #计算第一列的总和
-
find
find
用于查找文件。find /path/to/directory -name "filename" find /path/to/directory -type f -name "*.txt" find /path/to/directory -mtime -7 #查找7天内修改过的文件
-
ssh
ssh
远程连接。ssh root@rootIP ssh -i /path/to/private_key.pem root@rootIP
-
scp
scp
用于远程控制。scp /path/to/local/file username@hostname:/path/to/remote/directory scp -i /path/to//path/to/private_key.pem <space>/path/to/local/file username@hostname:/path/remote/directory # 使用密钥
-
top/htop
top
和htop
用于监控系统资源。top #实时监控状态 htop #有更友好的界面
-
ps
ps
用于显示进程。#小知识:pgrep 进程名称 ##查找进程 #pkill 进程名称 ##杀死进程 ps -aux #显示所有进程,可用管道符 | 进行grep查询 ps -aux | grep "process_name" #查找特定进程
-
netstat
netstat
用于显示网络连接。netsta -tuln #显示所有监听接口 netsta -anp | grep "port_number" #显示特定端口进程
二、文件权限
查看和修改文件权限
ls -l #查看文件权限
chmod 755 filename #修改文件权限
chown user:group filename #修改文件所有者和组
三、进程管理
查找和杀死程序
ps -aux | grep "process_name" #查找进程
kill -9 PID #杀死进程
pkill "process_name" #根据名称杀死程序,可Tab
四、Shell脚本编写(Bash)
基本结构
#!/bin/bash
#代表注释
#定义一个变量
NAME="Your_name"
#打印输出
echo "Hello,$NAME!"
#条件判断
if [condition]; then
echo "true"
else
echo "fail"
if
#循环
for i in {1..5};do
echo "这是第$i次循环!"
done
#读取输入
read -p "请输入您的名字:" name
echo "你好,$name!"
函数定义
#!/bin/bash
function greet(){
echo "Hello,$1!"
}
greet "World"
五、综合实例
#!/bin/bash
#检查参数
if [$# -ne 1];then
echo "Usage:$0 <port_number>"
exit 1
fi
PORT=$1
#查找占用指定端口的进程
PID=$(netstat -anp | grep :":$PORT" | awk '{print $7}' | cut -d'/' -f1)
#检查是否有进程占用端口
if [-z "$PID"]; then
echo "没有进程占用端口$PORT"
exit 0
fi
#杀死占用端口的进程
echo "杀死占用端口 $PORT 的进程,PID:$PID"
kill -9 $PID
#检查进程是否被杀死
if [$? -eq 0]; then
echo "进程已成功杀死"
else
echo "杀死进程失败"
fi
开发环境
Linux下的C++开发工具链包括编译器(如g++)、调试器(如gdb)以及构建工具(如make和CMake)。以下将详细讲解这些工具的使用方法,并通过示例帮助您更好地理解。
一、g++编译器
- 基本用法
-
编译单个文件
g++ source.cpp -o executable
-
-o
:指定输出文件名。 -
默认生成的可执行文件
a.out
。 -
指定C++标准:
g++ -std=c++11 source.cpp -o executable
-
-std=c++11
:指定使用 C++11 标准。 -
添加调试信息
g++ -g source.cpp -o executable
-
-g
:在可执行文件中添加调试信息 -
编译多个文件
g++ source.1cpp source2.cpp -o executable
-
链接外部库
g++ source.cpp -o executable -lm
-
-l
:链接库文件,-lm
:表示链接数学库。
-
示例
假设有一个简单的C++程序
Hello.cpp
:#include <iostream> int main() { cout << "Hello,World!" <<std::endl; return 0; }
编译并运行:
g++ -std=c++11 hello.cpp -o hello ./hello
二、gdb调试器
- 基本用法
GDB是一个强大的调试工具,用于调试程序中的错误
- 启动GDB
gdb ./executable
-
常用命令
-
break<行号>
:在指定行设置断点。 -
run
:运行程序。 -
next
:执行下一行(不进入函数)。 -
step
:执行下一行(执行函数)。 -
continue
:继续运行知道下一个断点。 -
print<变量>
:打印变量的值。 -
bt
:查看调用栈。 -
quit
:退出GDB。
-
-
示例
debug.cpp
#include <iostream> int main(){ int a=10; int b=0; std::cout << a / b << std::endl; return 0; }
编译并添加调试信息:
g++ -g -std=c++11 debug.cpp -o debug
使用GDB调试:
gdb ./debug
在gdb中运行:
(gdb) break 5 //在第5行设置断点
(gdb) run //运行程序
(gdb) print a / b //打印变量值
(gdb) bt //查看调用栈
(gdb) quit //退出GDB
三、make和CMake构建工具
- Make工具
Make是一个自动化构建工具,通过读取Makefile
文件来编译和链接程序
- 简单的Makefile示例:
CC = g++
CFLAGS = -std=c++11 -Wall
TARGET = myprogram
SRCS = main.cpp util.cpp
OBJS = $(SRCS:.cpp=.o)
all:$(TARGET)
$(TARGET):$(OBGS)
$(CC)$(CFLAGS) -o $@$^
%.o:%.cpp
$(CC)$(CFLAGS) -c $< -o$@
clean:
rm -f $(OBJS)$(TARGET)
- 使用方法
make //编译程序
make clean //清理生成的文件
- CMake工具
CMake工具是一个跨平台的构建工具,通过 CMakelists.txt
文件描述构建过程。
- 简单的CMakeLists.txt示例:
cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)
set(CMAKE_CXX_STANDARD 11)
add_executable(MyProgram main.cpp util.cpp)
# 链接库(如果需要)
target_link_libraries(MyProgram pthread)
- 使用方法:
mkdir build
cd build
cmake ..
make
- 示例:
假设项目结构如下:
Myproject/
|——CMakeLists.txt
|——main.cpp
|——util.cpp
CMakeLists.txt
内容:
cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)
set(CMAKE_CXX_STANDARD 11)
add_executable(MyProgram main.cpp util.cpp)
编译步骤:
mkdir build
cd build
cmake ..
make./Myproject
四、综合示例
假设我们要开发一个简单的C++项目,包含两个源文件main.cpp
和util.cpp
,并使用CMake进行构建。
- 项目结构
myproject/
|——CMakeLists.txt
|——main.cpp
|——util.cpp
|——include——util.h
- 源文件内容
main.cpp
:
#include <iostream>
#include “util.h"
int main(){
std::cout << “The answer is : " << add(2,3) << std::endl;
return 0;
}
util.cpp
:
include "util.h"
int add(int a,int b){
return a+b;
}
util.h
:
#pragma once
int add(int a, int b);
- CMakeLists内容:
cmake_minimum_required(VERSION 3.10)
project(MyProject CXX)
# 添加头文件搜索路径
include_directories(include)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
# 添加可执行文件
add_executable(MyProgram main.cpp util.cpp)
- 编译运行
mkdir build
cd build
cmake ..
make
./Myproject
通过以上示例,您应该能够熟练使用 g++、gdb、make 和 CMake 进行 Linux 下的 C++ 开发。